9.

Swift(.swift)完全ガイド — Apple/2014・Optional・Protocol-Oriented・SwiftUI・SwiftPM・ABI 安定

編集
この記事の要点
  • Swift は Apple が 2014 年 WWDC で発表した、iOS / macOS / watchOS / tvOS / visionOS 向けの近代的システム言語
  • 設計リーダーは Chris Lattner(LLVM の作者)、現在は Apple とコミュニティが共同開発(2015 年に OSS 化)
  • Optional 型String?)で nil 安全を型レベルで強制し、null 参照例外を構造的に排除
  • Protocol-Oriented Programming(POP) が中核思想。クラス継承よりプロトコル+拡張を推奨
  • 宣言的 UI フレームワーク SwiftUI(2019)が iOS 開発の主流に
  • パッケージ管理は Swift Package Manager(SwiftPM)、定義ファイルは Package.swift
  • Swift 5(2019)で ABI 安定 達成。OS 同梱の標準ライブラリにリンクできるようになりバイナリサイズが激減

概要

Swift(スウィフト) は、2014 年 6 月の Apple Worldwide Developers Conference(WWDC)で発表された汎用プログラミング言語です。設計を主導した Chris Lattner は LLVM コンパイラ基盤の作者として知られ、Objective-C の代替として「安全・高速・表現豊か」をスローガンに開発されました。それまで Apple プラットフォームの主要開発言語だった Objective-C は Smalltalk 由来の特殊な構文を持ち、学習コストが高かったため、より現代的な構文と強力な型システムを備えた Swift への移行が進みました。

Swift は 2015 年 12 月に Apache License 2.0 で オープンソース化 され、現在は Apple とコミュニティが共同で開発を進める Swift.org プロジェクトとして運営されています。Linux・Windows サポートも公式に提供され、サーバサイド Swift(VaporHummingbird 等)の選択肢にもなりつつあります。

型システムは 静的・強型付け+強力な型推論。最大の特徴は Optional 型 で、String? という型は「文字列があるか、ないか(nil)」を 型レベルで表現 します。Optional を扱うには if letguard let???.!(強制アンラップ)などを使い、nil をうっかりアクセスしてクラッシュする旧来の問題を構造的に防ぎます。さらに Protocol-Oriented Programming(POP) という思想を中心に据え、クラス継承よりも プロトコル+プロトコル拡張 で振る舞いを合成することを推奨します。

ファイル種類とビルド成果物

拡張子 / 形式役割備考
.swiftSwift ソースコードUTF-8。main.swift はトップレベルにコードを書ける唯一の特別な名前
Package.swiftSwiftPM プロジェクト定義Swift DSL で依存・ターゲット・プラットフォームを宣言
.swiftmoduleコンパイル済みモジュール型情報と AST を含むバイナリ
.swiftinterfaceモジュールインターフェースABI 安定のため公開シグネチャを書き出した中間表現
.xcodeproj / .xcworkspaceXcode プロジェクトiOS / macOS アプリのビルド設定一式
.appmacOS / iOS アプリバンドル実体はディレクトリ。Info.plist + 実行バイナリ + リソース
.ipaiOS 配布アーカイブApp Store 提出やアドホック配信に使用
.framework / .xcframework動的フレームワーク複数アーキテクチャ/プラットフォームを 1 パッケージに

「Hello, World」

// hello.swift — Swift の最小プログラム
import Foundation

func greet(_ name: String) -> String {
    return "Hello, \(name)!"
}

// Optional とジェネリクス
func firstNonNil<T>(_ values: [T?]) -> T? {
    for v in values {
        if let unwrapped = v {
            return unwrapped
        }
    }
    return nil
}

print(greet("World"))

let xs: [String?] = [nil, nil, "Swift", "Apple"]
if let first = firstNonNil(xs) {
    print("first non-nil: \(first)")
}

\(...) は文字列補間、String? は Optional、if let は安全なアンラップです。SwiftPM 環境なら swift package init --type executableswift run でビルド+実行できます。

パッケージ管理・ビルドツール

  • Swift Package Manager(SwiftPM):Apple 公式。Package.swift 1 本で依存・ターゲット・プラットフォーム条件を宣言。Xcode に統合済み
  • Xcode:iOS / macOS / watchOS / tvOS / visionOS の公式 IDE。Storyboard、SwiftUI Preview、Instruments プロファイラを内蔵
  • CocoaPods:Ruby 製の伝統的依存管理。Podfile + pod install。SwiftPM への移行が進む
  • Carthage:分散型依存管理。プロジェクト統合を最小限に
  • swift build / swift run / swift test:CLI でのビルド・実行・テスト
  • swift-format / swiftlint:フォーマッタとリンタ
  • fastlane:App Store 配信自動化(Ruby 製)

関連言語との比較

項目SwiftObjective-CKotlinRust
登場年2014198420112010
型システム静的・強・型推論動的メッセージング静的・強静的・強・所有権
主用途iOS/macOS/サーバ旧 Apple 開発Android/JVMシステム/CLI
nil 安全Optional 型nil 許容(緩い)Nullable 型(?Option/Result
メモリ管理ARC(自動参照カウント)ARCJVM GC所有権+ライフタイム
UI フレームワークSwiftUI / UIKitUIKit / AppKitJetpack Compose各種(Tauri等)

注意点・落とし穴

  • 強制アンラップ !let s = optional! は nil なら即クラッシュ。本番では避け、guard let / if let / ?? を使う
  • 値型 vs 参照型struct は値型でコピー、class は参照型。Swift 標準ライブラリは StringArrayDictionary も値型(CoW で効率化)
  • ARC と循環参照:クロージャや親子参照で self を強参照すると解放されない。[weak self] / [unowned self] で切る
  • Xcode 必須の壁:iOS アプリ開発は実質 Mac + Xcode が必要。CI も macOS ランナーを要する
  • Swift バージョン互換:5 で ABI 安定したが、source-stability は別物。// swift-tools-version: を明示する
  • コンパイル速度:型推論が強力すぎてビルド時間が長くなりがち。let x: [String: [Int: AnyObject]] = ... のような複雑な式は型を明示する
  • 並行性モデルの世代交代:旧来の GCD(Grand Central Dispatch)から Swift 5.5 以降の async/await・Actor へ移行中。混在する大規模コードベースに注意

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Python(.py / .pyc)
  2. JavaScript(.js / .mjs / .cjs)
  3. TypeScript(.ts / .tsx)
  4. Go(.go)
  5. Rust(.rs)
  6. Java(.java / .class / .jar)
  7. C / C++(.c / .h / .cpp / .hpp)
  8. Ruby(.rb)
  9. Swift(.swift)
  10. Kotlin(.kt / .kts)

最近更新/作成されたページ