Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
格納型プロパティ / 計算型プロパティ / lazy
Swiftのプロパティには、値を格納する格納型プロパティ、値を計算する計算型プロパティ、初回アクセス時にのみ生成される lazy プロパティがあります。
構文
struct / class 型名 {
// 格納型プロパティ
var 変数名: 型 = 初期値
let 定数名: 型
// 計算型プロパティ(get + set)
var computed: 型 {
get { return 値 }
set { 格納プロパティ = newValue }
}
// 計算型プロパティ(get のみ)
var readOnly: 型 { return 値 }
// lazy プロパティ(初回アクセス時に生成)
lazy var 名前: 型 = 初期化式
// プロパティオブザーバ
var monitored: 型 {
willSet { print("変更前: \(newValue)") }
didSet { print("変更後: \(oldValue) → \(monitored)") }
}
// 型プロパティ
static var shared: 型 = 初期値
}
構文一覧
| 構文 | 概要 |
|---|---|
| var / let プロパティ | 値を直接格納するプロパティです。 |
| var computed: T { get set } | 値を計算して返す読み書き可能なプロパティです。 |
| var readOnly: T { return ... } | 値を計算して返す読み取り専用のプロパティです。 |
| lazy var | 初めてアクセスされるときにのみ初期化されるプロパティです。 |
| willSet / didSet | プロパティ変更前・変更後に呼ばれるオブザーバです。 |
| static var / let | インスタンスではなく型に属するプロパティです。 |
サンプルコード
class Temperature {
// 格納型プロパティ(摂氏)
var celsius: Double {
willSet { print("変更前: \(celsius)°C") }
didSet { print("変更後: \(celsius)°C") }
}
// 計算型プロパティ(摂氏 ↔ 華氏の変換)
var fahrenheit: Double {
get { return celsius * 9 / 5 + 32 }
set { celsius = (newValue - 32) * 5 / 9 }
}
// 読み取り専用
var kelvin: Double {
return celsius + 273.15
}
// lazy プロパティ(初回アクセス時に計算)
lazy var boilingPoint: String = {
print("沸点を計算中...")
return "100°C"
}()
// 型プロパティ
static let absoluteZero = -273.15
init(_ celsius: Double) {
self.celsius = celsius
}
}
let temp = Temperature(20.0)
print("摂氏: \(temp.celsius)°C")
print("華氏: \(temp.fahrenheit)°F")
print("絶対温度: \(temp.kelvin)K")
// willSet / didSet の動作確認
temp.celsius = 100.0
print("100°C = \(temp.fahrenheit)°F")
// lazy: 初回アクセス時のみ初期化
print(temp.boilingPoint)
print(temp.boilingPoint) // 2回目は "計算中..." が出ない
// 型プロパティ
print("絶対零度: \(Temperature.absoluteZero)°C")
概要
計算型プロパティは値を格納せず、アクセスのたびに計算して値を返します。setter(set)を省略すると読み取り専用になります。setter 内では暗黙の引数名『newValue』が使えます。
『lazy』プロパティは初期化コストの高いオブジェクトに適しています。インスタンス生成時には作られず、初めてアクセスされたときだけ作られます。lazy プロパティは let ではなく var で宣言する必要があります。また、構造体の lazy プロパティにアクセスするには var のインスタンスが必要です。
struct と class の違いについてはstruct の基本 / memberwise initializerを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。