- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2016-05-15T05:49:59+00:00","default:nitta","nitta")
[[Swift]]
*Swift/クラス [#n73f083c]
クラスのインスタンスは参照型である。
すなわち、変数に代入したりメソッドの引数に渡す時に、コピーが作られるのではなく、同一のインスタンスへの参照が渡される。
class 型名 [: スーパークラス] {
[変数/定数定義]
[イニシャライザ定義]
[メソッド定義]
[その他の定義]
}
クラスでは memberwise initializer は利用できない。
内部の変数の名前を指定して初期値を与えるのは、オブジェクト指向の情報隠蔽
(encapsulation) を台無しにしてしまうので。
クラス定義にイニシャライザがない場合、「クラス名()」という記法で default initializer
でインスタンスを生成できるが、すべてのインスタンスプロパティに初期値が設定されている必要がある。
class Time {
var hour = 0, min = 0
init(hour:Int, min:Int) {
self.hour = hour; self.min = min
}
func add(min:Int) {
let m = self.min + min
if m = 60 {
self.min = m % 60
let t = self.hour + m / 60
self.hour = t % 24
} else {
self.min = m
}
}
}
let t1 = Time(hour:13, min:20)
let t2 = t1
print(t1.toString()) // 13:20 と表示される
ti.inc()
print(t2.toString()) // 13:21 と表示される
構造体の定義ではメンバ変数の値を変更するメソッドには mutating という修飾子をつけたが、
クラスの定義では必要ない。
クラスのインスタンスは、定数と変数のどちらに格納されていても、格納型プロパティの変更が可能である。
||クラス|構造体|列挙型|
|参照型/値型|参照型|値型|値型|
|変更に関する制約|なし|(*1)|(*2)|
|インスタンスプロパティ|格納型/計算型|格納型/計算型|-/計算型|
|タイププロパティ|格納型/計算型|格納型/計算型|格納型/計算型|
|継承|◯|-|-|
|プロトコル継承|◯|◯|◯|
|memberwise initializer|-|◯|-|
-(*1) --- インスタンスの格納型プロパティの値を変更するメソッドに mutating 指定が必要。また、定数に格納されたインスタンスはプロパティの値が変更できない。
-(*2) selfの値を変更するメソッドにmutating指定が必要。