本文へスキップ
BecomeCoder

Swift(iOSアプリ)コース · 第4章 型と関数でモデルを作る · レッスン17

class と参照型

ブラウザで完結

導入

structによく似た class もあります。大きな違いは「コピーの仕方」。SwiftUIで画面をまたいでデータを共有する ObservableObject(第8章)は class で作ります。まず基本を押さえましょう。

説明

classinit で初期化を書き、self で自分自身のプロパティを指します。他のクラス継承 して機能を受け継げます。

class Animal {
    var name: String
    init(name: String) {
        self.name = name
    }
    func sound() -> String { "..." }
}

class Dog: Animal {
    func bark() -> String { "\(name): ワン!" }
}

let dog = Dog(name: "ポチ")
print(dog.bark())

class Dog: Animal は「DogはAnimalを継承する」という意味。Dogは name をそのまま使えます。

最大の違いは class は参照型 であること。コピーしても同じ実体を指すので、片方を変えるともう片方も変わります。

class Counter {
    var value = 0
}
let a = Counter()
let b = a          // 同じ実体を指す(コピーではない)
b.value = 10
print(a.value)     // 10 ← a も変わる!

「1つの実体をみんなで共有したい」なら class、「独立したコピーがほしい」なら struct。SwiftUIでは 画面のモデルは struct、共有する状態は class が基本の使い分けです。

やってみよう

Dog に別のメソッドを足したり、Counter の例で ab を変えて共有される様子を確かめたりしましょう。

演習

Counter を使って a.value5 にしたあと b = a として b.value = 100 にし、a.value(100)を print してください。

ヒント1を見る

class は参照型なので b = a で同じ実体を指します。

ヒント2を見る

b.value を変えると a.value も変わります。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Swift / SwiftUI — ブラウザ内で実行(学習用)

Swiftの教材サブセットを動かす学習用ランナーを読み込みます。ふつうのコードは print の出力を表示し、SwiftUI(struct: View)を書くと右にiPhone風のライブプレビューを描画します(本物のXcode/Swiftコンパイラではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。