2/2にConnect IQ SDKの4.0.0プレビュー1が出たので入れてみた。
上の記事によると、4.0.0での修正は以下の2点のようだ。
- Monkey Types
型宣言ができるようになったらしい。 - Resource Compilerの更新
SVGファイルが使えるようになった。
SVGファイルは私のウォッチフェイスでは取り扱っていないので、Monkey Typesによって現在のコードがどう変わるかテストしてみた。
現在のソースそのままコンパイルが通るか
まず、コンパイルオプションに「-l 1」を設定し、ビルドしてみた。
結果としてはコンパイルエラーが発生し、そのままでは使用できなかった。
エラーの内容は大きく分けると4種類。
- using Toybox.Test;がエラーになる
- 型が特定できずエラーになる
- 配列変数の宣言、使用でエラーになる
- switchでStatement is not reachable.が出る
using Toybox.Test;がエラーになる
using Toybox.Test;の部分で、「Cannot find module ‘$.Toybox.Test’ in using statement.」というエラーが出て、これ以外のソースのコンパイルが止まってしまった。
using Toybox.Test;を外せば問題ないし、他の名前空間のusing句ではエラーが出なかった。
ただ、using Toybox.Testを外しコンパイルしたところ、次のエラーが出てしまった。
それが「型が特定できずエラーになる」でエラーになるというもの。
型が特定できずエラーになる
テストメソッドではクラス内メソッドのテストをしている。
テストをするためのオブジェクトを生成するのだが、標準的なやり方はテストメソッド内でnewするといった方法。
私がやったのは、Toybox.Application.getApp()を呼び出しすでに生成済みのものを使ったやり方。
実際これでテストできたし、newするのも面倒だったのでいいかなと思ったのだがエラーが出た。
エラーとしては、以下の2つが出ている。
- Cannot find symbol.
- Cannot determine if container access is using container type.
一つ目は、
Toybox.Application.getApp()
で取り出したオブジェクトはAppBaseクラスなのだが、私は、自分用に派生したクラスのメンバー変数をテスト用として呼び出ししていた。
var view = app.view_;
とこんな感じで。
AppBaseには当然view_というメンバーは存在しないので、そこでCannot find symbol.というエラーが出た。
2つ目のエラーは、view_オブジェクトメソッドの返却値をコンテナとして取り扱ったため。
view_はクラスの定義ではvarとしか宣言していないためクラスが特定できず、そのためメソッドの返却値をコンテナとして認識できなかったためではないかと思われる。
こちらもas句を使い型を特定することで、エラーは解消された。
配列変数の宣言、使用でエラーになる
クラスメンバー、関数の引数、返り値でコンテナタイプを使う場合、as Arrayとコンテナを特定しないといけないみたいだ。
また、コンテナのクラスメンバーは、クラス生成時に初期化をしないといけない。
初期化の場所は、宣言場所もしくはコンストラクタメソッド内のどちらか。
var hoge as Array = new [1];
上のような宣言かinitializeメソッド内でnewしておく必要がある。
今回、関数、宣言部分をかなり修正することになってしまった。
switchでStatement is not reachable.が出る
以下のようなコードでエラーがでる。
switch(model) {
case "vivoactive_hr":
view_ = new DigitalHRJView();
return [ view_ ];
break;
returnの後のbreakにはいかないよといったもの。
その他気が付いたこと
- 3.2.xのシミュレーターでの日本語の曜日表示問題はこのプレビュー版では修正されていなかった。
ちょっと残念。 - プログラムの保存フォルダに、拡張子mirというファイルが作成されていた。
これは、ソースのコンパイル中の中間ファイルのような内容だった。
- パフォーマンスについての変化はなかった。
- 新たにimport句ができたのだが、今後はこちらを推奨するのかな。
もしくは異なる名前空間中に同じ名称のものがあった場合は、using句を使うのか?
usingだとas句で型を指定する場合、Lang.Longと親の名前空間を書かないといけなくなり、コード量が多くなるからimport句を導入したのかもしれない。
コメント