Swift による iOS 開発入門

ホーム > Swift のクラスと構造体 > プロパティ

プロパティ

ここでは、Swift のクラスや構造体におけるプロパティについて説明します。

説明がくどくなるので、以下「クラスや構造体」 とかかずに「クラス」と書きます。

プロパティについては、クラスも構造体もほぼ同様です。特に違いがある場合は、ここは違う、などと書くようにします。

ストアド・プロパティ

クラス内において、そのクラスの値を保持する変数・定数のことは ストアド・プロパティ (stored properties) といいます。

変数の場合は var で、定数の場合は let で定義します。

定数は初期化後は変更できません。

class Person {
	let name: String
	var age: Int
	
	init(name: String, age: Int) {
		self.name = name
		self.age = age
	}
}

var p = Person(name: "Hanako", age: 25)
p.name // "Hanako"
p.age // 25
p.age = 30 
// p.name = "Ichiro" // Error!

レイジー・ストアド・プロパティ

Swift ではストアドプロパティを、レイジー・ストアド・プロパティとして定義しておけば、プロパティを初めて利用するときに、初期化されるようになります。

これによって無駄なメモリを使わずに済みます。

レイジー・ストアドプロパティを指定するには、lazy 修飾子を指定します。

次の例では、Person オブジェクトの company プロパティにアクセスするまでは、Company クラスが初期化されません。

class Company {
	let name: String
	
	init(_ name: String){
		println("Company.init!")
		self.name = name
	}
}

class Person {
	let name: String
	var age: Int
	lazy var company = Company()
	
	init(name: String, age: Int){
		self.name = name
		self.age = age
	}
}

var p = Person(name:"Hanako",age:25)
p.name
p.age
// p.company.name

Playground での実行例は次のようになります。

p.company へアクセスする箇所のコメントアウトをやめると、イニシャライザが実行され Company が作成されたことがわかります。

コンピューテッド・プロパティ

実際に値を保持するのではなく、他のプロパティの値から計算した値をプロパティとすることも出来ます。

これをコンピューテッド・プロパティ (computed properties, 計算プロパティ) といいます。

コンピューテッド・プロパティに値をセットする場合は、次のように set を使います。

class Point {
	var x : Double
	var y : Double
	
	var x2 : Double {
		get {
			return x * 2
		}
		set {
			x = newValue/2.0
		}
	}
	
	init(x: Double, y : Double){
		self.x = x
		self.y = y
	}
}

set(newX) のように新たに変数を指定することも出来ますが、指定しなければ、set ブロックの中では新しい値は newValue という名前で取得できます。

尚、上記の例であるコンピューテッド・プロパティである x2 を読み取り専用にするばあいは、set ブロックを記述しません。

..	
var x2 : Double {
	get {
		return x * 2
	}
}
..	

この場合は get も書かずに、次のようにもかけます。

..	
var x2 : Double {
	return x * 2
}
..	

プロパティ・オブザーバ

プロパティには、プロパティ・オブザーバー (property observers) を設定して、変更が発生するときに処理を行うことができるようになっています。

データベースのトリガーのような感じです。

レイジー・ストアドプロパティには設定できません。

オブザーバは、プロパティ変更前に呼ばれる willSet と、変更後に呼ばれる didSet があります。

willSet では newValue で新しい値が取得でき、didSet では変更前の古い値が取得できます。

ホーム > Swift のクラスと構造体 > プロパティ