Swift2.3から3.0のアップデートで苦労したところ

広告

Swift

Swiftで何かアプリを作ろうか、修正しようかと思うと、概ねxcodeのバージョンが上がっていて、さらにSwiftのバージョンも上がり下位互換が無いので、いつも苦労しています。
こんなにころころ仕様が変わるのって普通なのでしょうか。
正直、辟易としています。
と言っても解決しないと先へは進めませんので、頑張ります。


基本的には、2.3から3.0へアップデートすると、いろいろ使えなくなるのですが、概ね自動変換後に少し修正すれば、コンパイルは通るようになりました。
xcode8では、2.3を継続して使うか3.0にするか選択が可能です。
しかし結局どこかで3.0へ移行しないといけませんので早めに対処してしまうのが得策です。


Any、AnyObjectの変更は、いろいろなところで書かれていますので割愛しますが、既に作ってしまっているものに関しては、as AnyObjectの箇所が増えて可読性は悪くなりますが、下手にAnyを使うよりもそのままAnyObjectを使った方が変なバグは生まれないかなと思いました。


そして今回苦労したところは、コンパイルは通るけど落ちるようになっていた箇所です。
具体的には、IndexSetを使っていた箇所が影響を受けました。
whileで、IndexにNSNotFoundが返ってくるまで回していたのですが、返ることはなくnilが入って落ちる事象が発生していました。
結局、IndexSetの扱いが変わったのかは定かな情報は無かったのですが、IndexSetを使うのを止めて、NSIndexSetを使うようにしたら問題なく動くようになりました。
IndexSetをNSIndexSetに変更することで、変更となった箇所は以下の通り。


  • IndexSet → NSIndexSet
  • first → firstIndex
  • last → lastIndex
  • integerGreaterThan → indexGreaterThanIndex

原因がわからなくてはまりました。
未だにIndexSetの取扱いが変わったのかはわかりませんが・・・


---
そろそろSwiftの仕様も落ち着いて欲しいのですが・・・初代Swiftからは大分変更となりました。
分かりやすくなったのか悪くなったのかというと・・・書き方が変わると慣れるのに時間がかかるので、個人的には悪くなったと感じます。
もちろん便利になったところもありますが、最初の書き方で動いているものを動かなくするのはどうなのでしょう。
せっかく取っつきやすい言語だったのにな・・・という思いを持っています。
xcodeのバージョンアップをしなければ良いのでしょうが、そういう問題でもないかな。