羽田
Xcode 8でswiftのプロジェクトを開くと、swift2.3からswift3への移行を促されるようになりました。Xcode 8ではswift3への自動変換ツールも搭載されているのですが、これだけでは上手くいかない修正事項や、CocoaPodsで利用している外部ライブラリなどの要因で移行できない事があります。
今回はswift2.3からswift3への移行を考えている人向けのポイントをまとめます。
swift3へ移行する際の問題点
・swift2.3とswift3が混在できない
・外部ライブラリのswift3対応状況
・swift3に対応する修正
大きくまとめると以上の3点の問題があります。
Xocde8でswift2.3のプロジェクトをロードすると、swift3へのコンバートを行うか訊かれますが、swift2.3とswift3は混在できないので、コンバートする場合はプロジェクト全体に問題が発生しないか気にしなくてはなりません。
CocoaPodsなどで外部ライブラリを利用している場合、外部ライブラリ側が対応している必要があります。1つでも未対応があれば、ライブラリの対応を待つ or ローカル修正が必要になります。
また自分のプロジェクト内でもswift3の言語仕様変更に対応する必要があります。既存のプロジェクトが引っかかる点をいくつか列挙します。詳細は後程。
・第1引数の明示化が必須になり省略できない
・for文のループがC言語スタイルではエラー
・インクリメント(++)デクリメント(--)がエラー
以上のような問題が立ちはだかります。
swift3言語対応
Xcode 8の機能でコンバートする際に、以下の変換は自動的に行われます。
swift2.3 | swift3 |
---|---|
ErrorType | ErrorProtocol |
NSUTF8StringEncoding | String.Encoding.utf8 |
NSxxx | xxx |
クラス名自体が変換されたものは自動的に置換されます。NSxxx(NSDate,NSURL,NSData)などの多くは、NSが取り除かれてしまいました。
swift3の言語仕様の変更で主要なものは以下の3点です。
1.第1引数の明示化
swift3では第1引数を省略できなくなりました。省略できないのですが、第1引数の前にXcode 8の自動変換で”_”の挿入対応がされています。”_”は第1引数に限りラベルを省略できる機能です。関数側の対応で呼び出し側のコードは変更する必要が無くなります。
この修正は面倒なだけで利点が無さそうに感じられますが、以下のような場合については同じ関数名で似たようなものが作りやすくなったという事のようです。
2.for文のループがC言語スタイルではエラー
昔から慣れ親しんだfor文は死にました。swiftに従うしかありません。
3.インクリメント(++)デクリメント(--)がエラー
これは自動的に修正してくれないので、”x += 1“などで対応しておきましょう。
オペレーターとして実装していた場合については、仕方がないのでinc,decなどの関数を追加するしか無さそうです。一般的にこの関数名で実装しておくというような流れがありそうなのですが見つかりませんでした。
他の変更などは以下を参照してください。
Swift.org - Migrating to Swift 2.3 or Swift 3 from Swift 2.2
swift3に移行しないで運用
swift3へ移行するのが正道ではありますが、外部ライブラリ側の対応がなければどうしようもないプロジェクトもあります。この場合、swift2.3で運用するにはXcode 8で以下のような設定が必要です。
1.プロジェクトのswift言語バージョンを設定
Targets > プロジェクト > Use Legacy Swift Launguage Version
YESを選択します。
2.外部ライブラリのバージョンを指定する(CocoaPods)
外部ライブラリ側がswift3に対応していた場合、明示的に2.3がビルドできるバージョンを指定しなくてはいけません。CocoaPodsを利用しているといつのまにかswift3に対応して動かなくなったりするので、以下の手順でswift2.3上で動くように対応します。
今回の記事ではswift3への移行が目標ではあったのですが、既存のプロジェクトがそのまま動くニーズは高いので、swift2.3はまだしばらく使われていくような気がします。
swift2.3で実行する方法は覚えておいた方が良さそうです。
ハダ
iOS/Android/Windows/Macなど各プラットフォームを手がけています。
前職は家庭用ゲームのプログラマでしたが、最近はスマホとPCでばかりゲームしています。