Swiftとは何か、構文と言語の主要概念

著者: IT Sectr 公開日: 2026-02-09 読了時間: 8 分

Swift は、Objective-Cの後継としてWWDC 2014で発表されたAppleの最新プログラミング言語です。Swiftは、型安全性、自動メモリ管理ARC(Automatic Reference Counting)、およびプロトコル指向アプローチを組み合わせています。Swift Programming Language は、言語の構文と標準ライブラリに関する主要な情報源です。

重要なポイント

  • Swift は、型推論、Optionals、プロトコル指向プログラミングを備えた静的型付け言語です
  • Optionals — Optional Binding(if let)とOptional Chaining(?.)による型安全なnil操作
  • ARC — 手動のretain/releaseなしでメモリを管理する自動参照カウント
  • クロージャ — コンテキストをキャプチャする匿名関数。コールバックAPIや関数型チェーンで使用
  • Struct vs Class — 代入と継承で動作が異なる値型と参照型

Swiftとは?

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を置き換えた理由

移行の主な理由:SwiftはObjective-Cで発生する可能性のあるエラーのクラス全体を排除します。型安全性はコンパイル時に型の不一致を防ぎます。Optionalsはnil参照外しを排除します。ARCはObjective-CのMRC/ARCとは異なり、初日から組み込まれています。Swiftの構文はより短く読みやすい — 調査によると、同等のタスクに対してObjective-Cと比較してコード量が30〜40%削減されます。

構文と基本構造

基本的な Swift構文 は、使い慣れたC言語風の構造と関数型言語の要素を組み合わせています。変数は var で宣言され、定数は let で宣言されます。コンパイラは型推論を使用するため、明示的な型注釈は曖昧な場合にのみ必要です。

swift
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の欠落はエラーではありません。

swift
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とnilの安全な操作

Optionals は、型システムレベルでnull参照の問題を解決するSwiftの中核概念です。Optionalは2つのケースを持つ列挙型です:.none(nil)と.some(Wrapped)。コンパイラは明示的なチェックなしでOptionalの使用を禁止し、実行時エラーのクラス全体を排除します。

swift
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が推奨するアプローチであるプロトコル指向プログラミングの基盤です。

swift
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)を持っています。

swift
// コンテキストキャプチャ付きクロージャ
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(参照型)に切り替えることを推奨しています。

特性StructClass
受け渡し方法値渡し(コピー)参照渡し
継承非対応対応
ARC管理不要ARC(参照カウント)
デイニシャライザ deinitなしあり
可変性プロパティ変更にはmutating func任意のメソッドで変更可能
コレクション内の格納挿入時にコピー参照が格納される

値型(struct) はマルチスレッド環境でより安全です — 各スレッドが独立したコピーを取得します。参照型(class) はUIKit(UIView、UIViewController)での作業に必要であり、参照同一性とシステムクラスからの継承が必要です。

ARCメモリ管理

ARC(Automatic Reference Counting) は、参照型のためのSwiftのメモリ管理システムです。コンパイラは実行時にretain/release呼び出しを挿入し、オブジェクトへの強参照の数を追跡します。カウンタがゼロになると、オブジェクトは即座に解放されます。

ARCの主な問題は retain cycles(循環参照)です。2つのオブジェクトが互いに強参照を保持していると、メモリが解放されません。解決策は、weak参照(解放時に自動的にnilになる)とunowned参照(オブジェクトが生存していることを保証)です。

swift
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にはどのようなデータ型がありますか?

SwiftはInt、Double、Float、String、Bool、Array、Set、Dictionary、タプルをサポートしています。数値型には固定サイズがあります:Int8、Int16、Int32、Int64、および符号なしUInt。日付の操作にはFoundationのDate、データにはDataが使用されます。

SwiftのOptionalとは何で、なぜ必要ですか?

Optionalは2つのケースを持つ列挙型です:.none(nil).some(Wrapped)。Swiftではif let、guard let、??による明示的なOptionalチェックが必要で、NullPointerExceptionを排除します。オプショナルチェーン(?.)を使用すると、ネストされたオプショナル値のプロパティに安全にアクセスできます。

Swiftのstructとclassの違いは何ですか?

struct — 値型、代入時にコピーされ、継承をサポートせず、ARCは不要。class — 参照型、参照で渡され、継承とデイニシャライザをサポート。Appleはデフォルトの型としてstructを推奨しています。

SwiftのARCメモリ管理はどのように機能しますか?

ARCは自動的にクラスオブジェクトへの強参照をカウントします。カウンタがゼロになるとメモリが解放されます。循環参照を防ぐには、weak(自動nil)とunowned(保証されたライフタイム)を使用します。ARCはstructとenumには適用されません。

Swiftのプロトコル指向プログラミングとは何ですか?

プロトコル指向プログラミングは、クラス階層の代わりに拡張付きプロトコルを使用するアプローチです。プロトコルはprotocol extensionsを介してデフォルトのメソッド実装を持つことができます。これにより、継承なしでコードを再利用でき、柔軟性とテスト容易性を維持できます。

まとめ

  • Swift — Optionals、ARC、プロトコル指向プログラミングを備えたAppleの静的型付け言語(iOS/macOS開発向け)
  • Optionals — Optional Binding、Optional Chaining、nil-coalescing演算子による型安全なnil操作
  • プロトコル+拡張 — デフォルトメソッド実装とコンポジションによるプロトコル指向プログラミングの基盤
  • クロージャ — コンテキストキャプチャ、trailing構文、メモリ管理用キャプチャリストを持つ匿名関数
  • Struct vs Class — 値型(コピー、スレッド安全性)対参照型(継承、ARC)
  • ARC — retain cyclesを防ぐweak/unowned修飾子付き自動参照カウント
  • Switchとパターンマッチング — 網羅的カバレッジ、タプルマッチング、範囲、where条件

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください