Swift言語のプロパティはクラス、構造体、列挙型に結びつけられます。
プロパティは単純に変数や定数を保持する「保持型プロパティ」と、値の設定取得時に計算を行う「計算型プロパティ」に分かれます。
保持型プロパティ
保持型プロパティは一番良く使うプロパティです。文字列や整数などの値をクラス持たせたいときに使用します。
//保持型プロパティを持つクラス
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let person = Person(name:"田中一郎", age:19)
person.name //=>"田中一郎"
person.age //=>19
非Optional型のプロパティは必ず初期化する必要があります。最初の例のようにイニシャライザで初期化するか、以下のようにプロパティの宣言部分で初期化します。
//保持型プロパティを持つクラス(初期値の設定が必須)
class Person2 {
var name: String = "default"
var age: Int = 99
}
保持型プロパティにlazyを追加すると初期化を遅らせることができます。
インスタンスを生成したタイミングでなく、実際にプロパティにアクセスしたタイミングで初期化が実行されるので、初期化に時間がかかるプロパティを使用する場合に便利です(例えばネットワークアクセス、ファイルアクセスして取得した値をしようしたい場合など)。
//lazyプロパティ(初期化を遅らせる)
class Team {
lazy var persons = [Person(name: "田中", age: 20), Person(name: "鈴木", age: 30)]
}
let team = Team()
//アクセスしたタイミングで生成される
team.persons[0].name //=>"田中"
計算型プロパティ
計算型プロパティは計算によって値を取得したり、設定したりするプロパティです。例えば保持型プロパティとして単価と数を持っている製品クラスの場合、価格は計算から導き出すことができます。
//計算型プロパティを持つクラス
class Product {
var unitPrice: Int //単価
var count: Int //数
init(unitPrice: Int, count: Int) {
self.unitPrice = unitPrice
self.count = count
}
var price: Int {
set(newPrice) {
//普通priceにはsetterは作成しないが説明のためあえて作成
unitPrice = newPrice
count = 1
}
get {
//単価*数=価格を計算して返す
return unitPrice * count
}
}
//getのみの場合はgetを省略できる
// var price: Int {
// return unitPrice * count
// }
}
let product = Product(unitPrice: 100, count:9)
product.price //=>900
product.price = 333
product.unitPrice //=>333
プロパティ監視
プロパティには値が設定される・されたタイミングで処理を挟みこむための機能が準備されています。プロパティ監視と呼ばれる機能で、willSetはプロパティに設定される前、didSetはプロパティに設定された後呼ばれます。
プロパティの値を監視してデバッグしたい場合や、プロパティ設定に応じて処理を委譲したい場合(デリゲートメソッドを呼び出したい場合)などに使用します。
//プロパティの監視
class Book {
var title: String = "デフォルト本" {
willSet {
print("willSet: \(newValue)=>\(self.title)")
}
didSet {
print("didSet: \(oldValue)=>\(self.title)=>")
}
}
}
let book = Book()
book.title//=>"デフォルト本"
book.title = "ベストセラー本"
//"willSet: ベストセラー本=>デフォルト本\n"
//"didSet: デフォルト本=>ベストセラー本=>\n"
book.title//=>"ベストセラー本"