Day04:Swiftの基礎③ – オプショナルと構造体・プロトコル
クラッシュを避けるオプショナルの扱い方、値型と参照型の違い、そして共通ルールを与えるプロトコルを丁寧に解説します。
Optionalの理解
if let / guard let
値型 vs 参照型
Identifiable
if let / guard let
値型 vs 参照型
Identifiable
目次
今日のゴール
- オプショナル型(Optional)を理解する
struct
とclass
の違いを説明できる- プロトコルで「共通のルール」を設計できることを知る
オプショナルとは?
Swiftは安全性を重視します。値がある/ないの両方を表現するために オプショナル(Optional) が導入されています。
Example – Optionalの宣言
let text: String? = "Hello"
let empty: String? = nil
!
による強制アンラップは最終手段です。安全に値を取り出すには次の方法を使います。
安全な取り出し:if let
/ guard let
if let
let text: String? = "Hello"
if let t = text {
print("値は \(t)")
} else {
print("値はありません")
}
guard let
func greet(name: String?) {
guard let n = name else {
print("名前がありません")
return
}
print("こんにちは、\(n)さん")
}
greet(name: "太郎") // こんにちは、太郎さん
greet(name: nil) // 名前がありません
構造体(struct)とクラス(class)
複数の値をまとめて扱えるのが構造体(struct)です。SwiftUIでは構造体を使うことが推奨されます。構造体は値型のためコピーされます。一方、クラス(class)は参照型で、同じインスタンスを共有します。
struct(値型)
struct A { var x = 0 }
var a1 = A()
var a2 = a1
a2.x = 5
print(a1.x) // 0 (コピー)
class(参照型)
class B { var x = 0 }
var b1 = B()
var b2 = b1
b2.x = 5
print(b1.x) // 5 (参照共有)
このように、structは値型、classは参照型という違いがあります。SwiftUIではビューを軽量に保つためstructが使われます。
プロトコル(protocol)
プロトコルは「この型は必ずこの機能を持つ」という共通のルールを定義します。SwiftUIのView
やIdentifiable
などが代表例です。
Example – プロトコルの定義と準拠
protocol Greetable {
func greet()
}
struct Person: Greetable {
var name: String
func greet() {
print("こんにちは、\(name)です")
}
}
let p = Person(name: "太郎")
p.greet() // こんにちは、太郎です
SwiftUIでよく使う – Identifiable
struct Todo: Identifiable {
var id = UUID()
var title: String
var isDone: Bool
}
Identifiable
プロトコルに準拠すると、自動的にid
プロパティを持つようになり、リスト表示に適したデータ型になります。
今日の練習課題 & 解答
-
Optionalの練習: 文字列オプショナルを宣言し、値があれば「こんにちは○○さん」、なければ「名前不明」と出力します。
解答例
// 文字列オプショナルを用意 let name: String? = "太郎" if let n = name { print("こんにちは、\(n)さん") } else { print("名前不明") }
オプショナル
name
をif let
でアンラップし、値が存在する場合のみ挨拶を行います。name
がnil
なら「名前不明」と表示します。 -
構造体の練習:
Book
構造体(title
,author
)を定義し、インスタンスを作ってタイトルを出力します。解答例
// Book構造体を定義 struct Book { var title: String var author: String } // インスタンスの生成と利用 let book = Book(title: "吾輩は猫である", author: "夏目漱石") print(book.title) // 吾輩は猫である
Book
構造体を定義し、書籍タイトルと著者をプロパティとして持たせます。インスタンスを生成してタイトルを参照します。 -
Identifiableの練習:
Todo
構造体をIdentifiable
に準拠させ、簡単なリスト表示を行います。解答例
// Todo構造体をIdentifiableに準拠 struct Todo: Identifiable { var id = UUID() var title: String var isDone: Bool } // ダミーデータ let todos = [ Todo(title: "買い物に行く", isDone: false), Todo(title: "メールを送る", isDone: true) ] // SwiftUIでList表示する例 struct ContentView: View { let todos: [Todo] var body: some View { List(todos) { todo in Text(todo.title) } } } // ContentViewのPreview struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView(todos: todos) } }
まず
id
プロパティを持つTodo
構造体を作り、Identifiable
に準拠させます。次にダミーデータを用意し、List
を使ってタイトルを表示する簡単な例を示します。
チェックリスト
- Optionalの意味と
if let
/guard let
を説明できる - struct と class の違いを例で示せる
- Identifiableを使ってモデルをリスト化できる
コメント