[28日でiOSアプリ開発]Day04 Swiftの基礎を学ぶ③

当ページのリンクには広告が含まれています。
Swift Day04





Day04:Swiftの基礎③ – オプショナルと構造体・プロトコル


Day04:Swiftの基礎③ – オプショナルと構造体・プロトコル

クラッシュを避けるオプショナルの扱い方、値型と参照型の違い、そして共通ルールを与えるプロトコルを丁寧に解説します。

Optionalの理解
if let / guard let
値型 vs 参照型
Identifiable

目次

今日のゴール

  • オプショナル型(Optional)を理解する
  • structclass の違いを説明できる
  • プロトコルで「共通のルール」を設計できることを知る

オプショナルとは?

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のViewIdentifiableなどが代表例です。

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プロパティを持つようになり、リスト表示に適したデータ型になります。

今日の練習課題 & 解答

  1. Optionalの練習: 文字列オプショナルを宣言し、値があれば「こんにちは○○さん」、なければ「名前不明」と出力します。

    解答例

    // 文字列オプショナルを用意
    let name: String? = "太郎"
    
    if let n = name {
        print("こんにちは、\(n)さん")
    } else {
        print("名前不明")
    }

    オプショナルnameif letでアンラップし、値が存在する場合のみ挨拶を行います。namenilなら「名前不明」と表示します。

  2. 構造体の練習: Book構造体(title, author)を定義し、インスタンスを作ってタイトルを出力します。

    解答例

    // Book構造体を定義
    struct Book {
        var title: String
        var author: String
    }
    
    // インスタンスの生成と利用
    let book = Book(title: "吾輩は猫である", author: "夏目漱石")
    print(book.title) // 吾輩は猫である

    Book構造体を定義し、書籍タイトルと著者をプロパティとして持たせます。インスタンスを生成してタイトルを参照します。

  3. 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を使ってモデルをリスト化できる


tenjiprogramming
20代エンジニア。
メインで使用している言語はJava/JavaScript/TyoeScript/react/C言語
AWSなどクラウド周りも経験あり。
楽しいをモットーに記事を書いています。
Noteではサンプルコード付きのゲームの作り方など様々な内容を公開しています。
そちらも是非ご覧ください!
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次