Swift文法の基本とは?iOS開発の基礎構文を実務視点で解説
Swiftは、iPhoneアプリ、iPadアプリ、Apple Watchアプリ、macOSアプリなど、Appleプラットフォーム向けの開発で広く使われるプログラミング言語です。特にiOS開発では、Swiftの基本文法を理解していることが、画面実装、データ処理、API連携、状態管理、エラー処理など、あらゆる開発作業の土台になります。
Swiftは、読みやすくシンプルな構文を持ちながら、安全性を非常に重視している言語です。変数や定数、型、オプショナル、関数、構造体、クラスなどの仕組みは、単に文法として覚えるだけではなく、「安全にデータを扱う」「予期しないエラーを減らす」「保守しやすいコードを書く」という実務上の目的と深く関係しています。
本記事では、Swift文法の基本を、iOS開発の実務で使う視点から体系的に解説します。変数と定数、データ型、型推論、条件分岐、ループ、関数、オプショナル、クラス、構造体、classとstructの違いまで、Swiftを学び始めた人が最初に理解しておきたい基礎構文を整理します。
1. Swiftの特徴
Swiftは、Appleが提供するモダンなプログラミング言語であり、iOS開発において中心的な役割を持っています。Objective-Cよりも読みやすく、安全性の高いコードを書きやすいように設計されており、初心者にも比較的学びやすい一方で、大規模なアプリ開発にも耐えられる機能を備えています。
Swiftの基本特徴
| 項目 | 内容 |
|---|---|
| 主な用途 | iOSアプリ、macOSアプリ、watchOSアプリ、tvOSアプリ開発 |
| 設計思想 | 安全性、読みやすさ、実行性能、保守性 |
| 特徴的な文法 | 型安全、オプショナル、型推論、構造体、プロトコル |
| 実務での重要性 | UI実装、状態管理、データ処理、API連携の基礎になる |
1.1 安全性重視の言語設計
Swiftは、安全性を重視して設計されています。たとえば、値が存在しない可能性を明示的に扱うオプショナル型や、型の不一致をコンパイル時に検出する仕組みによって、実行時エラーを減らしやすくなっています。アプリ開発では、ユーザー入力、APIレスポンス、画面状態など、予測しにくいデータを扱う場面が多いため、安全に値を扱えることは非常に重要です。
実務では、クラッシュしにくいコードを書くことが品質に直結します。Swiftでは、nilを扱う場合に明示的な処理が必要になるため、「値があると思って使ったら実際には存在しなかった」というようなバグを防ぎやすくなります。この安全性重視の設計思想は、Swift文法全体を理解するうえで最初に押さえるべきポイントです。
1.2 型安全
Swiftは型安全な言語です。型安全とは、文字列、整数、真偽値、配列、独自の構造体など、データの種類を明確に扱い、不適切な型の代入や処理を防ぐ仕組みを意味します。たとえば、数値として扱うべき値に文字列を入れたり、nilの可能性がある値をそのまま使ったりすると、コンパイル時にエラーとして検出されます。
型安全によって、コードの意図が明確になります。変数や関数の引数に型が定義されていると、その値が何を表すのか、どのように使うべきなのかが分かりやすくなります。チーム開発では、他の開発者がコードを読んだときにも理解しやすくなるため、型安全はバグ防止だけでなく、保守性の向上にもつながります。
1.3 モダンで読みやすい構文
Swiftの構文は、比較的シンプルで読みやすく設計されています。変数宣言、条件分岐、ループ、関数定義などは直感的に書けるため、プログラミング初心者でも基本構文を理解しやすい特徴があります。また、型推論によって明示的な型指定を省略できる場面も多く、簡潔なコードを書きやすくなっています。
一方で、Swiftは単に簡単な言語ではありません。オプショナル、クロージャ、プロトコル、ジェネリクス、非同期処理など、実務で重要になる高度な機能も備えています。そのため、まずは基本文法をしっかり理解し、その上でSwiftUIやUIKit、API通信、データ永続化などの実装へ進むことが重要です。
2. 変数と定数
Swiftでは、値を保存するために変数と定数を使います。変数は後から値を変更できる入れ物で、定数は一度代入したら変更できない入れ物です。Swiftでは、変更しない値には定数を使うことが推奨されており、実務でもまず let を使い、必要な場合だけ var を使う考え方が基本になります。
2.1 var(変数)
var は、後から値を変更できる変数を宣言するときに使います。たとえば、ユーザー名、カウント、入力値、画面状態など、処理の途中で変化する可能性がある値には var を使います。
var name = "Taro"name = "Hanako"
この例では、最初に name に "Taro" を代入し、その後で "Hanako" に変更しています。var で宣言された値は再代入できるため、状態が変化する処理で使いやすいです。ただし、変更可能な値が多すぎると、どこで値が変わったのか追いにくくなります。
実務では、むやみに var を使うのではなく、「本当に後から変更する必要があるか」を考えることが重要です。状態変更が多いコードはバグの原因になりやすいため、変更が必要な箇所だけを var にすることで、コードの安全性と読みやすさを高められます。
2.2 let(定数)
let は、一度値を代入したら変更できない定数を宣言するときに使います。Swiftでは、値を変更する必要がない場合は let を使うことが基本です。
let age = 20
この例では、age に 20 を代入しています。let で宣言された値は後から変更できないため、誤って別の値を代入することを防げます。たとえば、設定値、固定の文字列、計算結果、APIから取得した後に変更しないデータなどは、let で扱うことが多いです。
let を使うと、コードを読む人に対して「この値は変わらない」という意図を伝えられます。これはチーム開発で非常に重要です。変更されない値が明確になることで、コードの流れを追いやすくなり、予期しない状態変化によるバグも減らせます。
2.3 実務ルール
Swiftの実務では、基本的に let を優先し、値を変更する必要がある場合だけ var を使うのが一般的です。これは、状態変更を最小限にし、コードの安全性を高めるためです。
let userName = "Taro"var score = 0score += 10
この例では、userName は変更されないため let、score は加算によって変化するため var を使っています。このように、値の性質に応じて let と var を使い分けることで、コードの意図が明確になります。
実務での使い分け
| 宣言 | 使う場面 | 実務上の考え方 |
|---|---|---|
| let | 値を変更しない場合 | 基本はこちらを優先する |
| var | 値を後から変更する場合 | 必要な場合だけ使う |
| let中心 | 安全性が高い | 状態変更が少なくバグを防ぎやすい |
| var多用 | 注意が必要 | 値の変化を追いにくくなる |
3. データ型
Swiftでは、値の種類をデータ型として扱います。整数、文字列、真偽値、小数、配列、辞書など、さまざまなデータ型があります。データ型を理解することで、値を正しく扱い、関数やUIに適切なデータを渡せるようになります。
3.1 Int(整数)
Int は整数を扱う型です。カウント、年齢、件数、スコア、インデックスなど、小数を含まない数値を扱う場合に使います。
let count: Int = 10
この例では、count という定数に整数 10 を代入しています。Swiftでは型推論があるため、let count = 10 と書いても Int と推論されますが、明示的に型を書いておくことで、コードの意図をより分かりやすくできます。
実務では、配列の要素数、APIレスポンスの数値、画面上の表示件数などで Int を使う場面が多くあります。数値を扱うときは、小数が必要なのか、整数だけでよいのかを意識して型を選ぶことが重要です。
3.2 String(文字列)
String は文字列を扱う型です。ユーザー名、タイトル、説明文、メッセージ、ボタン文言など、テキストを扱う場合に使います。
let text: String = "Hello"
この例では、text に "Hello" という文字列を代入しています。Swiftでは文字列をダブルクォーテーションで囲みます。UIアプリでは、画面上に表示するほとんどの文章が String として扱われます。
また、Swiftでは文字列補間を使って、変数の値を文字列の中に埋め込むことができます。
let name = "Taro"let message = "Hello \(name)"
文字列補間は、ユーザー名や数値を画面表示用のテキストに組み込むときによく使われます。実務では、表示文言を作る場面で非常に頻繁に使う構文です。
3.3 Bool(真偽値)
Bool は、true または false の真偽値を扱う型です。ログイン状態、表示状態、チェック状態、条件判定などでよく使われます。
let isLogin: Bool = true
この例では、isLogin が true であることを示しています。Bool は条件分岐と組み合わせて使われることが多く、アプリの状態を表す重要な型です。
たとえば、ユーザーがログインしているかどうかによって表示する画面を変える場合、Bool を使って分岐できます。実務では、isLoading、isEnabled、isSelected、isHidden のように、状態を表す変数名でよく使われます。
4. 型推論
Swiftには型推論という仕組みがあります。型推論とは、代入された値からSwiftが自動的に型を判断する仕組みです。これにより、毎回すべての型を書く必要がなくなり、コードを簡潔に書けます。
4.1 自動で型を決定
Swiftでは、次のように型を書かなくても、代入された値から型が推論されます。
let name = "Taro"
この場合、"Taro" は文字列なので、Swiftは name を String 型として扱います。型を書いていなくても、内部的には型が明確に決まっています。
型推論によって、コードは短く読みやすくなります。特に、代入する値から型が明らかな場合は、型を省略することで自然なコードになります。ただし、型が分かりにくい場面や、意図を明確にしたい場面では、明示的に型を書くこともあります。
4.2 明示的な型指定も可能
Swiftでは、必要に応じて明示的に型を指定できます。
let name: String = "Taro"
このように書くと、name は String 型であることが明確になります。型推論に任せても同じ結果になりますが、明示的に書くことで、コードを読む人に意図を伝えやすくなります。
実務では、型が複雑な場合、初期値だけでは型が分かりにくい場合、APIレスポンスやモデル定義などで明確に型を示したい場合に、明示的な型指定を使います。型推論と明示的な型指定を適切に使い分けることが、読みやすいSwiftコードを書くために重要です。
5. 条件分岐(if)
条件分岐は、条件に応じて処理を変えるための構文です。Swiftでは if 文を使って、「もし条件が正しければこの処理を行い、そうでなければ別の処理を行う」という書き方ができます。
let age = 20if age >= 18 { print("Adult")} else { print("Child")}
この例では、age が18以上であれば "Adult" を表示し、それ以外であれば "Child" を表示します。if 文は、ログイン状態、入力チェック、権限確認、APIレスポンスの判定など、実務で非常によく使われます。
iOSアプリでは、条件によって画面表示を変える場面が多くあります。たとえば、ユーザーがログイン済みならマイページを表示し、未ログインならログイン画面を表示するような処理です。if 文は、アプリの状態に応じた分岐処理の基本になります。
6. switch文
switch 文は、値のパターンに応じて処理を分ける構文です。条件が複数ある場合、if 文を何度も書くよりも、switch 文を使う方が読みやすくなることがあります。
let score = 80switch score {case 90...100: print("A")case 70..<90: print("B")default: print("C")}
この例では、score の値に応じて評価を分けています。90...100 は90以上100以下、70..<90 は70以上90未満を意味します。Swiftの switch 文は範囲指定や複数条件にも対応しており、柔軟に条件を分けられます。
実務では、ステータスコード、画面状態、ユーザー種別、APIレスポンスの結果、列挙型の分岐などで switch 文がよく使われます。特に enum と組み合わせると、状態ごとの処理を安全かつ読みやすく書けるため、Swiftらしい実装になります。
7. ループ(for)
for 文は、同じ処理を繰り返すための構文です。配列の要素を順番に処理したり、指定した回数だけ処理を繰り返したりする場合に使います。
for i in 0..<5 { print(i)}
この例では、0 から 4 までの数値を順番に表示します。0..<5 は、0以上5未満の範囲を表します。Swiftでは、このような範囲演算子を使って、簡潔にループを書くことができます。
実務では、配列内のデータを画面に表示する、APIから取得したリストを処理する、複数の項目を順番にチェックするなどの場面で for 文を使います。特にiOS開発では、ユーザー一覧、商品一覧、投稿一覧など、リストデータを扱う場面が多いため、ループ処理は基本中の基本です。
8. while文
while 文は、条件が満たされている間、処理を繰り返す構文です。繰り返し回数があらかじめ決まっていない場合や、特定の条件を満たすまで処理を続けたい場合に使います。
var i = 0while i < 3 { print(i) i += 1}
この例では、i が3未満の間、print(i) を実行し、その後 i を1ずつ増やしています。i が3になると条件を満たさなくなり、ループが終了します。
while 文を使うときは、条件がいつか必ず false になるように注意する必要があります。条件が変わらないままだと無限ループになり、アプリが固まる原因になります。実務では、for 文の方が安全で読みやすい場合が多いため、繰り返し回数や対象が明確な場合は for 文を使うことが一般的です。
9. 関数
関数は、処理をひとまとまりにして再利用するための仕組みです。同じ処理を何度も書くのではなく、関数として定義しておくことで、コードの重複を減らし、読みやすく保守しやすいコードにできます。
func greet(name: String) { print("Hello \(name)")}greet(name: "Taro")
この例では、greet という関数を定義し、name という文字列を受け取ってメッセージを表示しています。greet(name: "Taro") と呼び出すことで、"Hello Taro" が出力されます。
実務では、データ変換、入力チェック、API処理、画面更新、計算処理などを関数として分けることで、コードを整理します。関数を適切に分割すると、何をする処理なのかが明確になり、テストや修正もしやすくなります。
10. 戻り値付き関数
戻り値付き関数は、処理の結果を呼び出し元に返す関数です。Swiftでは、-> を使って戻り値の型を指定します。
func add(a: Int, b: Int) -> Int { return a + b}
この例では、a と b という2つの整数を受け取り、その合計を Int として返します。呼び出し側では、返された値を変数や定数に代入して使えます。
let result = add(a: 3, b: 5)print(result)
戻り値付き関数は、計算結果、変換結果、判定結果などを返す場面でよく使われます。たとえば、価格を計算する関数、入力値が有効かどうかを判定する関数、APIレスポンスを表示用データに変換する関数などが実務でよく登場します。
11. オプショナル型
オプショナル型は、Swiftを理解するうえで非常に重要な概念です。オプショナルは、「値があるかもしれないし、ないかもしれない」状態を表します。Swiftでは、値が存在しない状態を nil として扱いますが、通常の型には nil を代入できません。nil を扱うには、オプショナル型として宣言する必要があります。
11.1 nilを扱える型
オプショナル型は、型名の後ろに ? を付けて表します。
var name: String? = nil
この例では、name は String? 型です。つまり、文字列が入る可能性もありますが、nil の可能性もあります。通常の String 型には nil を入れられませんが、String? であれば nil を扱えます。
実務では、APIから取得した値、ユーザー入力、データベースの値、画面遷移時に渡される値など、必ず存在するとは限らないデータを扱う場面が多くあります。オプショナルを使うことで、値がない可能性を明示的に扱えるため、クラッシュを防ぎやすくなります。
11.2 アンラップ
オプショナル型の値を使うには、値が存在するか確認してから取り出す必要があります。この処理をアンラップと呼びます。代表的な方法が if let を使ったオプショナルバインディングです。
if let unwrapped = name { print(unwrapped)}
この例では、name に値が入っている場合だけ、unwrapped に取り出して print します。もし name が nil であれば、処理は実行されません。
オプショナルの扱いは、Swiftの安全性を支える重要な仕組みです。実務では、強制アンラップを安易に使うとクラッシュの原因になるため、if let や guard let を使って安全に値を取り出すことが推奨されます。オプショナルを正しく扱えるかどうかは、Swift開発力に直結します。
12. クラス
クラスは、プロパティとメソッドを持つ設計単位です。Swiftでは、クラスを使ってデータと処理をまとめることができます。クラスは参照型であり、同じインスタンスを複数の場所から参照できます。
class User { var name: String init(name: String) { self.name = name }}
この例では、User というクラスを定義し、name というプロパティを持たせています。init は初期化処理で、インスタンスを作るときに name を設定します。
let user = User(name: "Taro")print(user.name)
クラスは、継承や参照共有が必要な場面で使われます。UIKitを使ったiOS開発では、UIViewController など多くのクラスが登場します。画面制御やライフサイクル管理など、オブジェクトとして状態を持ち続ける処理では、クラスがよく使われます。
13. 構造体
構造体は、Swiftで非常によく使われるデータ定義の仕組みです。struct を使って定義し、プロパティやメソッドを持つことができます。Swiftでは、モデルデータや小さな値のまとまりを表す場合に、構造体がよく使われます。
struct User { var name: String}
この例では、User という構造体を定義し、name というプロパティを持たせています。構造体は値型であり、代入や関数への受け渡し時に値がコピーされる性質があります。
let user = User(name: "Taro")print(user.name)
Swiftでは、クラスよりも構造体を優先する考え方が一般的です。特に、ユーザー情報、商品情報、投稿データ、設定値など、データそのものを表す場合は struct が向いています。値型であるため、意図しない共有状態が発生しにくく、安全に扱いやすい特徴があります。
14. class と struct の違い
Swiftでは、class と struct の違いを理解することが非常に重要です。どちらもプロパティやメソッドを持てますが、最も大きな違いは、クラスが参照型であり、構造体が値型であることです。
class と struct の基本比較
| 項目 | class | struct |
|---|---|---|
| 型の性質 | 参照型 | 値型 |
| 継承 | できる | できない |
| 共有状態 | 発生しやすい | 発生しにくい |
| 主な用途 | 画面制御、参照共有、継承が必要な設計 | データモデル、値のまとまり、安全な状態管理 |
| Swiftでの基本方針 | 必要な場合に使う | まず優先して検討する |
14.1 class
class は参照型です。つまり、インスタンスを別の変数に代入しても、同じ実体を参照します。そのため、一方でプロパティを変更すると、もう一方から見た値も変わることがあります。
class UserClass { var name: String init(name: String) { self.name = name }}let user1 = UserClass(name: "Taro")let user2 = user1user2.name = "Hanako"print(user1.name) // Hanako
この例では、user1 と user2 は同じインスタンスを参照しています。そのため、user2.name を変更すると、user1.name も変わります。これは参照型の特徴です。
クラスは、同じ状態を複数箇所で共有したい場合や、継承を使いたい場合に向いています。ただし、状態が共有されるため、どこで値が変更されたのか分かりにくくなることもあります。実務では、参照共有が本当に必要な場面で使うことが重要です。
14.2 struct
struct は値型です。代入や受け渡しをすると、基本的に値がコピーされます。そのため、一方を変更しても、もう一方には影響しにくい特徴があります。
struct UserStruct { var name: String}var user1 = UserStruct(name: "Taro")var user2 = user1user2.name = "Hanako"print(user1.name) // Taroprint(user2.name) // Hanako
この例では、user2 に user1 を代入していますが、構造体は値型なのでコピーされます。そのため、user2.name を変更しても、user1.name は変わりません。
Swiftでは、データモデルを作るときに struct がよく使われます。値が不用意に共有されないため、安全に状態を扱いやすいからです。特にSwiftUIでは、状態管理やViewの設計において値型の考え方が重要になるため、構造体の理解は欠かせません。
15. Swift文法の本質
Swift文法の本質は、「安全性」と「読みやすさ」を両立しながら、アプリの状態を正しく扱うことにあります。変数、定数、型、オプショナル、関数、構造体、クラスは、それぞれ単独の文法ではなく、安全なアプリ開発を支える設計要素です。
Swift文法の本質整理
| 観点 | 内容 |
|---|---|
| 安全性 | 型安全とオプショナルによってクラッシュを防ぎやすい |
| 読みやすさ | シンプルな構文と明確な型で意図を伝えやすい |
| 状態管理 | let、var、struct、classを使い分けて状態を扱う |
| 実務性 | UI、API、データ処理、画面遷移の基礎になる |
| 本質 | 安全に状態を扱い、保守しやすいコードを書くこと |
15.1 「安全性」と「読みやすさ」が中心設計
Swiftは、安全性と読みやすさを中心に設計されています。型安全、オプショナル、定数優先、明確な関数定義などにより、コードの意図をはっきり表現できます。これにより、実行時のクラッシュや意図しない動作を減らしやすくなります。
実務では、動くコードを書くことだけでなく、他の人が読んでも理解できるコードを書くことが重要です。Swiftの文法は、正しく使うことで、安全で読みやすいコード設計を支えてくれます。
15.2 型とオプショナルがバグを防ぐ
Swiftでは、型とオプショナルがバグ防止に大きく貢献します。型によって扱える値の種類が明確になり、オプショナルによって値が存在しない可能性を明示できます。これにより、予期しないnilや型の不一致によるエラーを防ぎやすくなります。
iOSアプリでは、API通信やユーザー入力など、値が常に存在するとは限らない場面が多くあります。オプショナルを正しく扱うことは、安定したアプリを作るうえで非常に重要です。
15.3 UIアプリ開発はこの文法が基礎になる
Swiftの基本文法は、UIアプリ開発のあらゆる場面で使われます。画面に表示する文字列は String、状態の判定は Bool、件数やインデックスは Int、画面状態の分岐には if や switch、データのまとまりには struct が使われます。
つまり、基本文法を理解していないと、SwiftUIやUIKitのコードを正しく読むことが難しくなります。見た目の実装に進む前に、まずはSwiftの基本構文をしっかり理解しておくことが重要です。
15.4 小さな構文理解が大規模開発に直結する
Swiftの基本文法は小さな構文の集合ですが、その理解は大規模開発にも直結します。let と var の使い分け、オプショナルの安全な扱い、関数分割、構造体とクラスの選択は、アプリ全体の設計品質に影響します。
小さなコードの書き方が雑だと、アプリが大きくなったときに保守しにくくなります。逆に、基本文法を丁寧に使える開発者は、規模が大きくなっても読みやすく安全なコードを書きやすくなります。
15.5 「安全に状態を扱う設計」がSwiftの本質
Swiftの本質は、安全に状態を扱う設計にあります。アプリ開発では、ユーザー操作、通信結果、画面遷移、入力値、保存データなど、多くの状態を扱います。Swiftは、型、定数、オプショナル、構造体などによって、その状態を安全に管理しやすくしています。
単に文法を暗記するだけではなく、「なぜこの文法があるのか」「どのように安全性につながるのか」を理解することが大切です。Swift文法を実務視点で理解すると、バグの少ない、読みやすく、保守しやすいiOSアプリを作れるようになります。
おわりに
Swiftは、安全性と読みやすさを重視したモダンなプログラミング言語です。iOS開発では、Swiftの基本文法を理解することが、画面実装、データ処理、API連携、状態管理、エラー処理など、すべての開発作業の土台になります。
特に重要なのは、let と var の使い分け、基本データ型、条件分岐、ループ、関数、オプショナル、クラス、構造体の理解です。これらは初心者向けの基礎でありながら、実務でも毎日のように使う文法です。基礎を曖昧にしたまま進むと、SwiftUIやUIKitのコードを読んだときに理解が難しくなります。
Swift文法を学ぶときは、単に書き方を覚えるのではなく、「安全に状態を扱うための仕組み」として理解することが大切です。型とオプショナルはバグを防ぎ、let は意図しない変更を防ぎ、struct は安全なデータ管理を支えます。文法理解は、そのままiOS開発力につながります。
EN
JP
KR