Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

Swift3.0時代のSwift Scripting

こんにちは!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

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる