ダーヤス.com プレミアム

ダーヤス.comにようこそ。プレミアムな情報で、ワークライフバランスの充実を図りませんか。

【xcode】【iOS】【swift】xcode7に、iOS9にバージョンアップしたら、作りかけのプログラムに大量のエラーが。

      2016/08/31

xcode7に、iOS9にバージョンアップしたら、作りかけのプログラムに大量のエラーが

毎日ちょっとずつプログラムを加筆修正していたところ、どうも実機として使っているiPadminiに「iOS9にバージョンアップできます」といったアラートが。

そしてiOSをバージョンアップできるということはxcodeもそれに連動してバージョンアップできるということで。

というか、両方のバージョンをうまくあわせておかないと実機テストができなかったりするので、常に両方のバージョンを合わせるには両方を最新版にしておくのが手っ取り早い。

というわけでシルバーウィークという連休を利用してバージョンアップしてみたら、作りかけのコードに大量のエラーが発生したな。おめでとう。
swiftの仕様はちょこちょこ変わるとか言われていますが、本当のようですなあ。

override func touchesBegan(touches: Set, withEvent event: UIEvent?)

タッチ時に呼び出すメソッド。
これxcode6の時はoverride func touchesBegan(touches: Set, withEvent event: UIEvent)だったのですが、どうもNSObjectからUITouchと書く仕様になったようで。
あと、最後のUIEventとの末尾にオプショナルの?をつけるべきみたい。

ちなみに、以前のバージョンで作っているプロジェクトを開くと、初回時のみプログラムを最新版のバージョンに自動的にコンバートしてくれる機能があるみたい。
でコンバートしてもらった。
ちなみにコンバートしなくても、とりあえず「override func touchesBegan」くらいまで書けば自動的に「(touches: Set, withEvent event: UIEvent?)」という候補を出してくれるので、まあ焦る必要はなさそうです。

当然ながら、タッチ終了時に呼び出すメソッドの書き方も
「override func touchesBegan(touches: Set, withEvent event: UIEvent?){}」です。

定数をvarで定義するとletへの変換を促すサジェスチョンが。

まあ以前は定数を律儀にletで定義しないで変数としてvar定義したとしても別に何もアラート出なかったのですが、どうもvarで定義しておきながらその後値が変わらない、つまり定数で定義していいんじゃないか、というときは
「Variable '**' was never mutated; consider changing to 'let' constant」
というアラートが出るようになったらしい。
まあなんでもかんでも変数で定義しておけばあとで値変えるの楽じゃないか、とか安直に考えて全部変数で定義するよりも定数で定義したほうが処理が軽くなるのですかね。
よくわかりませんが、とりあえず従っておいて問題なさそうです。
あと、別にエラーではなくてアラートなので無視しても問題ないかと。

Initialization of immutable value '**' was never used; consider replacing with assignment to '_' or removing it.

定義したのに使ってない変数/定数があるので無駄に定義するな、という警告のようです。
というかこれxcode6のときも出てたのでしょうか?
今回バージョンアップ後にたくさん警告出たから一個一個潰すようになったから初めて気づいたけど実は以前から出ていたエラーなのかもしれません。

Value of Optional type 'SKEmitterNode?' not unwrapped; did you mean to use '!' or '?'?

sksファイルを使ってパーティクルを画面に表示する際にSKEmitterNodeとやらを使ってみたのですが、以前までは
let particle = SKEmitterNode(fileNamed: "MyParticle.sks")
でpartice定数を定義後に
self.addChild(particle)
と表示してなんら問題なかったのに、どうもSKEmitterNodeがオプショナル型のようで、これを使う際にちゃんとアンラップしないといけないらしい。
というわけでself.addChild(particle!)とかやるとエラーが消えました。

 - アプリ開発