Swift は、Objective-Cの後継としてWWDC 2014で発表されたAppleの最新プログラミング言語です。Swiftは、型安全性、自動メモリ管理ARC(Automatic Reference Counting)、およびプロトコル指向アプローチを組み合わせています。Swift Programming Language は、言語の構文と標準ライブラリに関する主要な情報源です。
重要なポイント
Swift は、AppleがiOS、macOS、watchOS、tvOS、visionOS向けに開発したマルチパラダイムプログラミング言語です。この言語の主な目標は、安全性、速度、構文の表現力です。SwiftはLLVMコンパイラを使用し、C++に匹敵するパフォーマンスの最適化されたマシンコードを生成します。
2014年のリリース以来、Swiftは6つのメジャーバージョンを経てきました。Swift 6(2024)は、並行コードの分離を厳格に制御することで、完全なデータ競合安全性モデルを導入しました。GitHub Octoverse 2025によると、Swiftはコミュニティ成長率でトップ10言語に入っており、Appleプラットフォームでの採用速度でRustやKotlinを上回っています。
Swiftは オープンソースでクロスプラットフォーム です — ソースコードはGitHub(Swift Open Source)で公開されています。Appleプラットフォーム以外にも、SwiftはLinuxやWindowsでサーバーサイド開発(Vapor、Hummingbird)に使用されていますが、主な領域はAppleエコシステム内のモバイルおよびデスクトップ開発です。
移行の主な理由:SwiftはObjective-Cで発生する可能性のあるエラーのクラス全体を排除します。型安全性はコンパイル時に型の不一致を防ぎます。Optionalsはnil参照外しを排除します。ARCはObjective-CのMRC/ARCとは異なり、初日から組み込まれています。Swiftの構文はより短く読みやすい — 調査によると、同等のタスクに対してObjective-Cと比較してコード量が30〜40%削減されます。
基本的な Swift構文 は、使い慣れたC言語風の構造と関数型言語の要素を組み合わせています。変数は var で宣言され、定数は let で宣言されます。コンパイラは型推論を使用するため、明示的な型注釈は曖昧な場合にのみ必要です。
import Foundation
// 定数と変数
let name = "Swift"
var version = 6.0
var count: Int = 42
// デフォルトパラメータを持つ関数
func greet(person: String, greeting: String = "Hello") -> String {
return "\(greeting), \(person)!"
}
// 早期終了のためのGuard-let
func parse(input: String?) -> Int {
guard let value = input, let number = Int(value) else {
return 0
}
return number
}Switchとパターンマッチング はSwiftではCやKotlinよりも強力です。Switchはタプル、範囲、where条件、値バインディングとのマッチングをサポートしています。コンパイラはすべてのケースの網羅的なカバレッジをチェックします — すべての可能な値がカバーされている場合、defaultの欠落はエラーではありません。
let point = (x: 3, y: -1)
switch point {
case (0, 0):
print("原点")
case let (x, y) where x == y:
print("XはYと等しい")
case let (x, y) where abs(y) > x:
print("Yの絶対値はXより大きい")
default:
print("点 (\(point.x), \(point.y))")
}Optionals は、型システムレベルでnull参照の問題を解決するSwiftの中核概念です。Optional
var optionalString: String? = "Hello"
optionalString = nil // 許可
// Optional Binding — 安全なアンラップ
if let text = optionalString {
print("テキスト: \(text)")
} else {
print("値がありません")
}
// Optional Chaining — プロパティへの安全なアクセス
let length = optionalString?.count ?? 0
// Nil-coalescing演算子
let greeting = optionalString ?? "Default"Optional Chaining(?.演算子)を使用すると、オプショナル値のメソッドを安全に呼び出したりプロパティにアクセスしたりできます。チェーンがnilで中断されると、式全体の結果はnilになります。Nil-coalescing(??)はデフォルト値を提供し、プレースホルダーテキストを表示するためのUIコードで広く使用されています。
プロトコル はSwiftで契約(プロパティとメソッドのセット)を定義します。Javaのインターフェースとは異なり、Swiftのプロトコルはプロトコル拡張(protocol extensions)を介してデフォルトの実装を持つことができます。これは、クラス継承の代わりにAppleが推奨するアプローチであるプロトコル指向プログラミングの基盤です。
protocol NamedEntity {
var name: String { get }
func description() -> String
}
// 拡張によるデフォルト実装
extension NamedEntity {
func description() -> String {
return "Entity: \(name)"
}
}
// 拡張による準拠
extension String: NamedEntity {
var name: String { return self }
}Protocol Extensions を使用すると、準拠する各型を変更せずにプロトコルにメソッドを追加できます。これは、Sequenceのmap、filter、reduce、JSONシリアライゼーションのCodableなどの共通ユーティリティを追加する場合に特に便利です。Appleは多くのフレームワーク(SwiftUI、Combine)を拡張付きプロトコル上に構築しました。
クロージャ は、外部コンテキストから変数をキャプチャする匿名関数です。構文的には、クロージャはKotlinのラムダに似ていますが、より柔軟な構文(trailing closure、短縮引数名$0/$1、autoclosures)を持っています。
// コンテキストキャプチャ付きクロージャ
let numbers = [5, 3, 8, 1, 9]
// Trailing closure syntax
let sorted = numbers.sorted { $0 < $1 }
// 関数型チェーン
let result = numbers
.filter { $0 > 3 }
.map { $0 * 2 }
.reduce(0, +)
// 関数パラメータとしてのクロージャ
func performAsync(completion: @escaping (Result<Data, Error>) -> Void) { }@escaping クロージャは、関数が戻った後にクロージャが実行される場合に使用されます — 典型的にはネットワークリクエストや非同期操作です。@autoclosure は式を自動的にクロージャでラップし、assertやショートサーキットロジックで使用されます。
structとclass の選択は、Swiftモデルを設計する際の最初の決定事項の1つです。Appleはデフォルトでstruct(値型)を使用し、継承や参照同一性が必要な場合にのみclass(参照型)に切り替えることを推奨しています。
| 特性 | Struct | Class |
|---|---|---|
| 受け渡し方法 | 値渡し(コピー) | 参照渡し |
| 継承 | 非対応 | 対応 |
| ARC管理 | 不要 | ARC(参照カウント) |
| デイニシャライザ deinit | なし | あり |
| 可変性 | プロパティ変更にはmutating func | 任意のメソッドで変更可能 |
| コレクション内の格納 | 挿入時にコピー | 参照が格納される |
値型(struct) はマルチスレッド環境でより安全です — 各スレッドが独立したコピーを取得します。参照型(class) はUIKit(UIView、UIViewController)での作業に必要であり、参照同一性とシステムクラスからの継承が必要です。
ARC(Automatic Reference Counting) は、参照型のためのSwiftのメモリ管理システムです。コンパイラは実行時にretain/release呼び出しを挿入し、オブジェクトへの強参照の数を追跡します。カウンタがゼロになると、オブジェクトは即座に解放されます。
ARCの主な問題は retain cycles(循環参照)です。2つのオブジェクトが互いに強参照を保持していると、メモリが解放されません。解決策は、weak参照(解放時に自動的にnilになる)とunowned参照(オブジェクトが生存していることを保証)です。
class ProfileViewController: UIViewController {
var onLogout: (() -> Void)?
func setupHandler() {
// [weak self]はretain cycleを防ぐ
onLogout = { [weak self] in
guard let self else { return }
self.dismiss(animated: true)
}
}
}クロージャ内でのretain cyclesを防ぐには、[weak self] をguard let self = self else { return } と共に使用します。このルールはUIKitで特に重要です。ViewControllerがそのプロパティへの強参照を保持し、それらのプロパティ内のクロージャがViewControllerを参照するためです。
よくある質問
SwiftはInt、Double、Float、String、Bool、Array、Set、Dictionary、タプルをサポートしています。数値型には固定サイズがあります:Int8、Int16、Int32、Int64、および符号なしUInt。日付の操作にはFoundationのDate、データにはDataが使用されます。
Optionalは2つのケースを持つ列挙型です:.none(nil) と .some(Wrapped)。Swiftではif let、guard let、??による明示的なOptionalチェックが必要で、NullPointerExceptionを排除します。オプショナルチェーン(?.)を使用すると、ネストされたオプショナル値のプロパティに安全にアクセスできます。
struct — 値型、代入時にコピーされ、継承をサポートせず、ARCは不要。class — 参照型、参照で渡され、継承とデイニシャライザをサポート。Appleはデフォルトの型としてstructを推奨しています。
ARCは自動的にクラスオブジェクトへの強参照をカウントします。カウンタがゼロになるとメモリが解放されます。循環参照を防ぐには、weak(自動nil)とunowned(保証されたライフタイム)を使用します。ARCはstructとenumには適用されません。
プロトコル指向プログラミングは、クラス階層の代わりに拡張付きプロトコルを使用するアプローチです。プロトコルはprotocol extensionsを介してデフォルトのメソッド実装を持つことができます。これにより、継承なしでコードを再利用でき、柔軟性とテスト容易性を維持できます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。