導入
structによく似た class もあります。大きな違いは「コピーの仕方」。SwiftUIで画面をまたいでデータを共有する ObservableObject(第8章)は class で作ります。まず基本を押さえましょう。
説明
class は init で初期化を書き、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 の例で a と b を変えて共有される様子を確かめたりしましょう。
演習
Counter を使って a.value を 5 にしたあと b = a として b.value = 100 にし、a.value(100)を print してください。
ヒント1を見る
class は参照型なので b = a で同じ実体を指します。
ヒント2を見る
b.value を変えると a.value も変わります。