Swiftのつらみ Q&A

Swiftの激しい変更への追従がつらいという意見をちょくちょく目にします。
確かにSwift 1正式リリースから2年経ったSwift 3でかなりの変更が盛り込まれて、その対応が大変というのは分かるものの、それはSwiftを利用する上での必要なコストであると感じつつ付き合っていました。
Swift 3まではこの辛さは妥当、そしてそれ以降はその辛さも激減する、と思っています。

# Q&A

以下、何か思うことがあれば随時追記していくかもです。

## 「Swift 3 対応つらい」

- Swift 3で、言語仕様の安定度的にはようやく所謂1.0レベルという印象
    - 何となく空気読んだり、これまでの変更の激しさ、[Swift Evolutionリポジトリ](https://github.com/apple/swift-evolution)など追うと、言語として今どのくらいのフェーズか把握出来るものの、一応1.0として正式リリースされて、さらに2年経った今でも変更追従コストが大きいことに不満生じるのは分かる
    - Swift 2まではバージョン0系扱いで、Swiftで書いたアプリの申請も受け付ける、くらいだったら実体に即していて不満少なかったかも
        - Swift 1.0で充分実用的でObjective-Cより遙かに優れた言語と感じていたが、変更の激しさという観点では0系としての位置づけが妥当だったかもしれない
        - とはいえ、Swiftに今後力入れていきたい中、早めに浸透させやすい今のバージョン番号の付け方をしたかったのも分かる、という印象
    - 去年12月にSwiftオープンソース化されてマイルストーンなど明らかになって今後の動向が読みやすくなったものの、それ以前はブラックボックスなところが大きく、当初Swiftが2年間もの間不安定であることは予測出来ない、という意見も分かる
- 個人的には脱Objective-C出来て大満足で、「つらい」とまでは感じていない
    - Swift 3は、過去最大の変更量だったので、対応に数日間要してしまったものの、「ちょっと大変だった」くらいの印象
        - うまくいけば1日で終えられるかな？くらいの予測だったものの、量が多かったりライブラリ対応の兼ね合いなどで数日かかってしまった
        - 基本的に、コードが良くなる方向の変更なので、コード追従作業もあまり辛くはなかった(面倒ではあった)
    - Objective-C書かざるを得ない時代の方がよほどつらかった
        - Objective-Cがイヤ過ぎて、そろそろiOSアプリ開発から身を引こうかなとも思ってきた中でのWWDCでのSwift発表！
    - 3でかなり理想的な言語に高速に仕上げてくれたことに感謝中
- そもそも最新iOS SDK・Xcode追従の方がつらかった
    - iOS 6でAuto Layout導入、iOS 7でフラットデザイン化、iPhone 6で画面横サイズ複数化、などへの対応やそれに伴う微妙な挙動の変化に対応する方がよほど大変だった
    - 一方、Swift対応はせいぜい数日手間かければ良いだけ、とかなり楽観的に捉えられていて、実際にそうだった

## 「Swift は一体いつ安定するの？」

- Swift 4でABI安定・ソースコード下位互換、という予定
    - 元々Swift 3でABI安定を目指していたが、間に合わず4で最優先事項として取組中
    - ABI安定すると、過去のバージョンのSwiftでビルドしたバイナリもそのまま利用出来る
        - ABI安定せずにソースコード下位互換だけでは、ソースコード変更の必要は無いものの、バージョンが上がる度にリビルドする手間が発生(Swift 3.0〜3.0.1は正にそのケース)
    - Swift 3〜4で、ソースコードの破壊的変更はあるはず
        - とはいえ、Swift 3に極力変更を詰め込んだこともあり、4でのソースコード破壊的変更はかなり限定的になるはず
        - 少なくとも、Swift 3対応の大変さの再来には絶対にならない
        - [SE-0144: Allow Single Dollar Sign as a Valid Identifier → Rejected](https://github.com/apple/swift-evolution/blob/68367bd395fdc25a2570d48278d8970b46df398b/proposals/0144-allow-single-dollar-sign-as-valid-identifier.md)のような、慎重に検討した結果どうしても今正したい、というマイナーな変更中心になるはず

## 「Swiftキャッチアップつらい」

- Swift 3までは変更が多くて大変だったのも分かるが、今後は変更が限定的なのでキャッチアップの労力はかなり減るはず
- Swift関連の動向中心に毎週配信する [Swiftレター - Medium](https://medium.com/swift-column/tagged/swiftレター) を10月から開始したので購読オススメ
- それでも「Swiftのキャッチアップのつらさ > Objective-Cという安定なレガシー言語での開発コスト」と感じるのであればまだObjective-Cでの開発継続をオススメ
    - **違う種類のつらさがありそう**なものの、[Xamarin.Forms](https://www.xamarin.com/forms)は安定・高品質のC#・XAMLで書けて、さらにAndroid対応なども出来てしまうので、アリかも

## 「今からSwift 3に手を出してもつらい？」

- 巷で言われているSwift言語仕様追従のつらさは、今から手を出す分にはほぼ問題無いはず
    - Swift 3でかなり安定
        - 3.1・3.2, …へのアップデート時に少しだけ変更あり得るかも
        - マイナーバージョンアップでもその都度ライブラリのリビルド必要、という面倒くささは3系の間は継続
    - Swift 4でABI安定など、より強固になる
        - 4へのアップデート時にコード内容によっては少しだけ追従の必要性あるかも
        - 4系の間は変更発生しなさそう(多分)
        - 5, 6, ...とメジャーアップデートのタイミングで小さな破壊的変更などはあり得るかも(個人的予想)
            - あるとしても3と比べて遙かに小さな変更のはず
- Swift 2系以前のコードが出回っているのでつらいかも？
    - 「サンプルコード通りに書いたのに動かない」と、困ったりしそう
    - 2016年9月より前のコードは基本的にSwift 2系以前なので注意
    - Swift 2系以前のコード・記事が害なわけではない
        - 充分有用な情報が多いが、コード例は随時3として書き換える必要がある、ということ
        - 仕様変更の変遷把握していれば書き換えられるものの、初見ではつらそう
            - 簡単な例では、Xcodeが書き換え法提案してくれるものの、完全では無い
    - 1-2年経てば巷のコード例もSwift 3以降のもの中心になっていくはず
- [公式リファレンス](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AboutTheLanguageReference.html)読むの大事
    - iBooks版オススメ: [The Swift Programming Language Swift by Apple Inc. on iBooks](https://itunes.apple.com/jp/book/swift-programming-language/id881256329?l=en&mt=11)

# 関連リンク

- [Swiftレター - Medium](https://medium.com/swift-column/tagged/swiftレター)
- [Swift 3の開発の振り返りとSwift 4の計画が記されたメールの紹介 - Qiita](http://qiita.com/mono0926/items/c51b74fae679e1e39d2b)
- [「Swiftのこれまでの動向のまとめと今後のさらなる発展の期待」フォローアップ - iOSDC 2016 - Qiita](http://qiita.com/mono0926/items/e6f989ed1fd89c49c8d7)
- [Build Insiderオピニオン：小野将之 - Build Insider](http://www.buildinsider.net/column/ono-masayuki)
    - [Swiftは3.0で安定するのか？ リリース予定日と新機能リスト - Build Insider](http://www.buildinsider.net/column/ono-masayuki/002)