プロパティの種類
- インスタンスプロパティ
- ストアプロパティ
- 変数ストアプロパティ
- 定数ストアプロパティ
- 遅延ストプロパティ
- コンピュテッドプロパティ
- Read-Onlyコンピュテッドプロパティ
- ストアプロパティ
- 型プロパティ
- ストアプロパティ
- コンピュテッドプロパティ
ストアプロパティ:値を格納するプロパティ
var varStored: String = “Hello"
let letStored: Int = 1
変数ストアプロパティ:再代入可能な値を保持するプロパティ
定数ストアプロパティ:再代入が出来ない、宣言時の値を保持するプロパティ
遅延ストアプロパティ:参照される際に初めて初期値が設定されるプロパティ
class File {
var name = “data.txt"
}
class Storage {
lazy var file = File() //遅延ストアプロパティ
var data = [String]()
}
let storage = Storage() //まだstorage.fileは生成されない
storage.data.append(“some data”) //まだstorage.fileは生成されない
print(storage.file.name) //参照されて初めて値が設定される
コンピュテッドプロパティ:値を計算するプロパティ
var greeting: String = “Hello"
var computed: String {
//プロパティを参照する際に実行して値を返す。
get {
return greeting
}
//プロパティに値を設定した時に実行される。
set(newValue) { //(newValue)はデフォルトで使用されるため、宣言時の省略が可能
greeting = newValue
}
}
Read-Onlyコンピュテッドプロパティ:読み取り専用のプロパティで常に値を返す
struct ViewSize {
var width = 0.0, height = 0.0
var size: CGSize {
return CGSize(width: width, height: height)
}
}
let newViewSize = ViewSize(width: 3.0, height: 5.0)
print(“view size is \(newViewSize.size)”) // "view size is 15.0"
ストアプロパティはclassとstructureで利用出来る一方、コンピュテッドプロパティではclassとstructureとenumで利用することが出来る。
プロパティオブザーバ
class HeightManager {
var height: Double = 100.0 {
//値がセットされる前に実行される(newValueはこれからセットする値)
willSet {
print(“身長が\(height)cmから\(newValue)cmになりました。")
}
//値をセットした後に実行される(oldValueは元の値)
didSet {
print("変更分は\(height - oldValue)cmです。")
}
}
}
let manager = HeightManager()
manager.height = 160.0
// 身長が100.0cmから160.0cmになりました。
// 変更分は60.0cmです。
インスタンスプロパティと型プロパティ
・インスタンスプロパティ:値がインスタンスに付随しているので、基本的に新しい新スタンスが生成される度に複製される。
・型プロパティ:値が型自身に付随しているので、何個インスタンスが生成されようが、実体は常に一つしか存在しない。
参考
https://www.slideshare.net/hasegawatomoki/swift-45247767
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254