Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swift 16年の歩み

Swift 16年の歩み

2026/11/12 に ZOZO.swift #3 で発表した登壇資料です。
https://zozotech-inc.connpass.com/event/411472/
株式会社ZOZO
ZOZOTOWN開発本部
プラットフォームエンジニアリング部
小松 悟
#zozoswift

Avatar for ZOZO Developers

ZOZO Developers PRO

November 12, 2026

More Decks by ZOZO Developers

Other Decks in Technology

Transcript

  1. 小松 悟 株式会社ZOZO · プラットフォームエンジニアリング部 · X: @tosh_3 2020年に株式会社ZOZOに新卒入社、以来ZOZOTOWN iOSアプリの

    開発に従事する。 現在ではプラットフォームエンジニアとして、基盤開発を主に担当。 Swift 6へのマイグレーションをやっています。 最近の日課は、1歳の娘と犬と遊ぶこと。口癖は人間万事塞翁が馬。 © ZOZO, Inc. 2
  2. Swift の概要 作者 発表 Chris Lattner WWDC 2014 LLVM /

    Clang の生みの親 2014年6月2日 正式リリース オープンソース化 2014年9月9日 2015年12月3日 Xcode 6.0 © ZOZO, Inc. 3
  3. Swift の最初のコミット 2010年7月17日 commit 18844bc Swift SVN r3 Chris Lattner

    · 0 files changed initial swift test commit afc81c1 Swift SVN r4 Chris Lattner · 9 files changed, 194 insertions(+) initial checkin, nothing much to see here. 2つ目のコミットで、最初の実装として Lexer と Parser が入った。ただしその中身は tools/swift/swift.cpp 1 int main() { } lib/Lex/Lexer.cpp 1 int X; lib/Parse/Parser.cpp 1 int x; ここから 2026年の今まで、16年 © ZOZO, Inc. 5
  4. 一人で書いていた時期 2010〜2011年 01 Apple でマネージャーをしながら、夜と週末の趣味で作り始めた 02 最初の356コミットは、すべて Lattner 一人 03

    1年でできたのは型チェックまで。コードの生成・実行はまだできない 2011年の Swift はこんな言語だった ↓ Swift, 2011 1 typealias int : __builtin_int32_type // int は組み込み型の別名 2 oneof bool { false, true } // oneof は後の enum 3 // if や while も、標準ライブラリの関数だった 4 func if (cond : bool) -> (body : () -> ()) -> () 5 func while (cond : bool) -> (body : () -> ()) -> () © ZOZO, Inc. 6
  5. チームができてから、WWDC での発表まで 2011年4月 WWDC 2013 の後 WWDC 2014 数人 数百人

    発表 上司を説得して Clang チームか ら数人をパートタイムで引き入 れた 「本気でやる」と決定。数百人 の取り組みに Swift を発表 Ted Kremenek 2011〜2014年 Doug Gregor John McCall ジェネリクスとコード生成はここで入 った © ZOZO, Inc. 7
  6. なぜ Objective-C とは別に、新しく Swift を作ったの か 01 Objective-C ユーザーは、根本的な変化を望まなかった •

    リテラル @[ ] の導入ですら大論争 02 Objective-C は1980年代初頭の、リソースが極端に限られた時代の言語 • 2010年には、参考にできる言語のアイデアがはるかに多かった — Rust, Haskell など © ZOZO, Inc. 8
  7. 年表 年月 できごと Xcode iPhone 2010年7月 Lattner が一人で Swift を書き始める

    – iPhone 4 2011年 Clang チームの Ted Kremenek、Doug Gregor、John McCall が参加 – iPhone 4s 2014年6月 WWDC 2014 で Swift を発表 – iPhone 5s 2014年9月 Swift 1.0 6.0 iPhone 6 / 6 Plus(iOS 8) 2015年9月 Swift 2.0 7.0 iPhone 6s / 6s Plus(iOS 9) 2015年12月 オープンソース化 – – 2016年9月 Swift 3.0 8.0 iPhone 7 / 7 Plus(iOS 10) 2017年9月 Swift 4.0 9.0 iPhone 8 / 8 Plus、iPhone X(iOS 11) 2019年3月 Swift 5.0 10.2 iPhone XS / XR(iOS 12.2) 2024年9月 Swift 6.0 16.0 iPhone 16 / 16 Pro(iOS 18) 2026年9月 Swift 6.4(今) 27.0 iPhone 18 Pro / 18 Pro Max(iOS 27) © ZOZO, Inc. 9
  8. Swift 1 1.0 2014年9月 1.1 2014年10月 1.2 © ZOZO, Inc.

    2014年9月〜 Optional、型推論、ジェネリクス、値型の struct / enum Xcode 6.0 · iPhone 6 Xcode 6.1 2015年4月 Xcode 6.3 Failable Initializer(init?) Mac 向けにも正式対応 • if let で複数の値を一度にアンラップ(ネストの解消) • 強制ダウンキャスト as! の導入 • 新しいコレクション型 Set • 定数(let)を宣言と同時に初期化しなくてもよくなった • クラスに static なメソッド・プロパティ 10
  9. Swift 1 当時のコード 2014年9月〜 // throws は無い。NSError をポインタ渡し var error:

    NSError? let json: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error) // guard は無い。出力は println if json == nil { println("読み込み失敗: \(error!)"); exit(1) } // 強制キャストは as。失敗すると落ちる let array = json as [[String: AnyObject]] var names = [String]() // C スタイルの for と ++ for var i = 0; i < array.count; i++ { // if let は 1 つずつ。ネストが深くなる if let name = array[i]["name"] as? String { // raw 値は fromRaw() if let category = Category.fromRaw(array[i]["category"] as Int) { names.append("\(name):\(category)") }}} // join と countElements はグローバル関数 println("\(join(", ", names))(\(countElements(names[0]))文字)") © ZOZO, Inc. 11
  10. Swift 2 2.0 2015年9月 Xcode 7.0 · iPhone 6s 2015年9月〜

    エラー処理: throws / do / try / catch protocol extension — プロトコルにデフォルト実装を書ける WWDC 2015「Protocol-Oriented Programming」 早期リターンのための guard スコープを抜けるときに処理を遅らせる defer API の利用可能性チェック #available println を削除し、print に統合 2.1 2015年10月 2.2 2016年3月 © ZOZO, Inc. 文字列補間の中に文字列リテラルを書ける Xcode 7.1 Xcode 7.3 ++ / -- と C スタイル for を非推奨に(3.0 で削除) // 〜2.1: C スタイル for と ++ for var i = 0; i < n; i++ { count++ } // 2.2〜: for-in と += for i in 0..<n { count += 1 } 12
  11. Swift 3 3.0 2016年9月 Xcode 8.0 · iPhone 7 2016年9月〜

    最初の引数も含め、すべての引数にラベルが付くのが原則に API デザインガイドラインに基づく大規模な改名(Great Renaming) UIColor.redColor() → UIColor.red 3.1 © ZOZO, Inc. 2017年3月 具体的な型で制約した extension、ジェネリック型の中のネスト型 Xcode 8.3 13
  12. Swift 4 2017年1月 4.0 Lattner が Apple を離れる(リードは Ted Kremenek

    に) 2017年9月 Xcode 9.0 · iPhone 8, X 4.1 2018年3月 4.2 2018年9月 © ZOZO, Inc. 2017年9月〜 Codable、複数行文字列 言語モードの導入 — Swift 4 のコンパイラで Swift 3 のコードもビ ルドできる Equatable / Hashable の自動合成 Xcode 9.3 CaseIterable、乱数 API Xcode 10.0 · iPhone XS, XR 14
  13. なぜ Xcode の「Swift Language Version」に 4 と 4.2 があるのか ここで選ぶのはコンパイラではなく言語モード(ソース互換モード)

    4.2 で Objective-C API の取り込まれ方が変わった UIControlState → UIControl.State 旧来の書き方で通る Swift 4 モードを残した Xcode Build Settings © ZOZO, Inc. 15
  14. Swift 5 ① ABI 安定と SwiftUI 5.0 5.1 2019年3月〜 2019年3月

    ABI 安定 Xcode 10.2 · iPhone XS 標準ライブラリに Result 型 が登場、Raw 文字列 #"..."#、@unknown default 2019年9月 SwiftUI を支える機能がまとめて入った • some View(opaque result type) • Property Wrapper(@State / @Binding の仕組み) • @ViewBuilder(Function Builder) Xcode 11.0 · iPhone 11 Module 安定(XCFramework) 5.2 2020年3月 5.3 2020年9月 5.4 2021年4月 © ZOZO, Inc. KeyPath を関数として渡せる map(\.name) Xcode 11.4 複数のトレーリングクロージャ(SE-0279)、@main、複数パターンの catch Xcode 12.0 · iPhone 12 Xcode 12.5 Result Builder が正式な言語機能に(Function Builder を一般化) 複数の可変長引数 16
  15. Swift 5 ② Swift Concurrency 5.5 2021年9月 5.6 2022年3月 5.7

    2022年9月 Xcode 14.0 · iPhone 14 if let x の短縮形、正規表現 Regex、 strict concurrency checking 5.8 2023年3月 @backDeployed、Upcoming Features © ZOZO, Inc. 2021年9月〜 async / await、actor Xcode 13.0 · iPhone 13 存在型を明示する any、#unavailable Xcode 13.3 Xcode 14.3 17
  16. Swift 5 ③ マクロと所有権 5.9 2023年9月 Xcode 15.0 · iPhone

    15 2023年9月〜 マクロ、if / switch を式として使える 所有権が入り始める • コピーできない型 ~Copyable • 引数修飾子 borrowing / consuming、consume 演算子 5.10 © ZOZO, Inc. 2024年3月 Xcode 15.3 -strict-concurrency=complete の強化 • データ競合をコンパイル時にすべて診断。例外は nonisolated(unsafe) / @unchecked Sendable だけ 18
  17. Swift 6 6.0 2024年9月 Xcode 16.0 · iPhone 16 6.1

    2025年3月 6.2 2025年9月 6.3 2026年3月 6.4 © ZOZO, Inc. 2024年9月〜 Swift 6 言語モード — データ競合がコンパイルエラーに Typed Throws、Int128、count(where:) 末尾カンマを許可 Xcode 16.3 Approachable Concurrency、default actor isolation Xcode 26.0 · iPhone 17 Xcode 26.4 2026年9月(今) Xcode 27.0 · iPhone 18 Pro Swift SDK for Android、@c Codable のエラーメッセージが読みやすく ~Sendable、Task Cancellation Shield ~Copyable / ~Escapable(またはその両方)な associated type を 持つ protocol 19
  18. 同じ処理を Swift 1 と Swift 6 で並べる Swift 1 —

    2014 var error: NSError? let json: AnyObject! = NSJSONSerialization.JSONObjectWithData( data, options: nil, error: &error) if json == nil { println("読み込み失敗: \(error!)") exit(1) } let array = json as [[String: AnyObject]] var names = [String]() for var i = 0; i < array.count; i++ { let name = array[i]["name"] as String let category = Category.fromRaw( array[i]["category"] as Int)! names.append("\(name):\(category)") } println("\(join(", ", names)) (\(countElements(names[0]))文字)") 01 JSON のデコード NSJSONSerialization とキャスト → Codable で decode © ZOZO, Inc. 02 エラー処理 NSError のポインタ渡し → do-catch 2014 → 2026 Swift 6 — 2026 struct Entry: Decodable { let name: String; let category: Category } let entries: [Entry] do { entries = try JSONDecoder() .decode([Entry].self, from: data) } catch { print("読み込み失敗: \(error)"); exit(1) } let names = entries.map { "\($0.name):\($0.category)" } print("\(names.joined(separator: ", ")) (\(names[0].count)文字)") 01 02 03 04 03 ループ C スタイル for と append → map 04 出力と文字列操作 println → print 関数 join / countElements → メソッド joined / count 20
  19. 未来 ① 並行処理と所有権のこれから 2026年11月時点 並行処理 所有権 async / await、actor →

    Approachable Concurrency、 ~Copyable、borrowing / consuming → ~Escapable、 default actor isolation associated type への拡張 この先入ってくる予定のもの この先入ってくる予定のもの • ファイル単位の default 宣言(SE-0478) • Cell / ConstCell / Volatile(レビュー中、SE-0556): 排 • 期限付きの withDeadline(SE-0526) 他性が成り立たないメモリを安全に扱う層 • Task.currentID(SE-0553) • yielding borrow / yielding mutate(SE-0474) • アクターに属さない Disconnected(SE-0538) • ~Copyable の deinit で自分を消費(SE-0544) © ZOZO, Inc. 21
  20. 未来 ② これからの方向性 Vision ドキュメント WebAssembly Approachable Concurrency Swift Testing

    Embedded Swift 厳格なメモリ安全性 マクロ C++ との相互運用 ネットワーク処理(新) Apple のプラットフォーム中心の言語から、Linux / Windows / Android / WebAssembly / 組み込みへ ピッチ段階 — 正式提案になる前。入るかはまだ分からない @called(once) 「最大1回しか呼ばれない」関数型 forums.swift.org/t/89088 guard do let x = f() catch { … } do-catch のネストを無くす糖衣構文 forums.swift.org/t/90330 今: do-catch だと正常系がネストする do { let value = try thrower() use(value) } catch { log(error); return } © ZOZO, Inc. ピッチ: 外側で value を使える。エラーも消えない guard do let value = thrower() catch { log(error); return } use(value) 22
  21. 出典・参考資料 P.5 最初のコミット swiftlang/swift のコミット履歴(18844bc、afc81c1) github.com/swiftlang/swift P.6 2011年のコード swiftlang/swift の

    test/swift.swift(コミット f72055598a) github.com/swiftlang/swift/blob/f72055598a/test/swift.swift P.7 チームができてから発表まで nondot.org(Chris Lattner)、ATP #205(2017年1月)、Swift Community Podcast #1(oleb.net 書き起こし) P.8 なぜ Swift を作ったのか Swiftly Speaking #11(Paul Hudson × Chris Lattner、2020年) P.10–19 各バージョンの変更点 swiftlang/swift の CHANGELOG github.com/swiftlang/swift/blob/main/CHANGELOG.md P.19 Swift 6 Swift 6.4 Released(swift.org ブログ) swift.org/blog/swift-6.4-released P.21–22 未来 Swift Evolution(提案一覧、Vision ドキュメント)、Swift Forums(ピッ チ) swift.org/swift-evolution · github.com/swiftlang/swift-evolution · forums.swift.org © ZOZO, Inc. 23