こんにちは!iOSエンジニアのすーです! iPhone7の発表が9/7にあると公表されてとてもうきうきしています!
ただ、iPhone7がくる→iOS10がくる→Xcode8がくる→ Swift3.0がくる ということで、
ぼちぼちSwift2.2で書かれたソースコードを修正していかないといけないですね。
現在Fammでは、ビルド時に実行する Run Script をswiftで書いていたりするのですが、
これもXcode8になると 動かなくなります。 悲しい...
ということで、今回はXcode8、Swift3.0時代、swiftでscriptを書く場合についての注意を、
Swift2.2のものと見比べながらまとめてみます。
ちなみに動作環境としては、2016/8/29現在最新のSwiftのsnapshot、Xcode8 beta 6を想定しています。
今回用意するscript
今回用意するscriptは、script実行時に渡した引数をカンマ区切りで1行で出力する簡単なscriptを準備します。
$ ./echo.swift apple banana candy # apple,banana,candy
こんな感じのシンプルなscriptです。
Swift2.2までのscript
Swift2.2までは、
- ファイルをそのままscriptとして使う場合はshebangを付け、
chmod
コマンド等で実行権限を与えておく - script実行時の引数の取得は
Process.arguments
を使う - 文法はSwift2.2に従う
を気をつけて書けば大丈夫でした。上記のscriptを書くと、こんな感じになります。
#!/usr/bin/env xcrun swift // Process.argumentsの0番目は自身のファイル名が入るので、dropで落とします let arguments = Array(Process.arguments.dropFirst()) print(arguments.joinWithSeparator(","))
Swift3.0に移行すると動かない!
さて、そのまま上記のscriptを、Swift3.0上で動かすと エラー になります。
通常のソースコードと同様、APIの変更が入っているのでそれを直していくのですが、1箇所どうしても躓く場所があります。それが、script実行したときの引数を取得する部分になります。 Swift2.2までだと、
// NG... let arguments = Process.arguments
で取得できたのですが、Swift3.0ではそれが できなくなります。 (厳密には取得の方法が変わります。)
Swift3.0からはこうする
Swift3.0からは、Process
が廃止された(正確にはrenameされた?)ので、代わりにCommandLine
を使うことにします。
// OK! let arguments = CommandLine.arguments
これで、script実行時の引数を取得できるようになります。
ここまでを踏まえて、joinWithSeparator
関数も直してあげると、
#!/usr/bin/env xcrun swift let arguments = Array(CommandLine.arguments.dropFirst()) print(arguments.joined(separator: ","))
このようになります! 試しに実行してみます。
$ swift --version Apple Swift version 3.0 (swiftlang-800.0.43.6 clang-800.0.38) Target: x86_64-apple-macosx10.9 $ ./echo_3_0.swift apple banana candy apple,banana,candy
めでたしめでたし。
まとめ
Swift2.2からSwift3.0になって色々刷新されているので、こんな初歩的なことでも躓いたりします。そして今回のようにscriptの話となるとなかなか情報もなかったり...。
もしswiftで書いたscriptをマイグレーションする時に同じ問題に直面したら参考にしていただければと思います。
なお、今回書いたscriptのサンプルはGistにあげてあります。
次回は、実際にFammで 活用しているswift script を紹介しようと思います!
積極採用中!!
子育て家族アプリFamm、カップル専用アプリPairyを運営するTimers inc. では、現在エンジニアを積極採用中! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings