import UIKit
class Baby {
var age:Int?
var name:String?
init?(age:Int, name:String){
self.age = age
self.name = name
if age < 0 {
return nil
}
}
}
var cuteBaby = Baby(age:-1, name: "John")
if let baby = cuteBaby{
print("John is born")
}else{
print("the age condition is wrong")
}
執行結果the age condition is wrong
swift程式設計入門,彼得潘
上面的程式碼中init後面加?或!的initializer稱為failable initializer ,此初始化器的物件型別為optional,也就是cuteBaby的型別為Baby?,因此需要進行optional binding。擷取上面一段程式碼
if age < 0 {
return nil
}
說明在age < 0的情況下回傳nil,所以 var cuteBaby = Baby(age:-1, name: "John”),cuteBaby的值為nil,結果為the age condition is wrong。
class Square {
var x:Double
var y:Double
var width:Double
init(x:Double,y:Double,width:Double) {
self.x = x
self.y = y
self.width = width
}
var centerX:Double{
get {
return x + width/2
}
set (newCenterX){
x = newCenterX - width/2
}
}
}
上面的程式碼我們設定一個計算屬性名稱為centerX,get代表可讀入 -> centerX會隨著x及width的關係來改變;set代表可寫入,我們也可以自行設定centerX的值,這樣就可以順便去更改x的值(因為x被設定成newCenterX - width/2)。下面是應用範例:
var aSquare = Square(x: 5, y: 10, width: 10)
aSquare.x
aSquare.centerX
aSquare.centerX = 20
aSquare.x
在第二行中,會得到x的值為5。
在第三行中,會得到centerX的值為10。
在第四行中,現在我們設定計算屬性centerX的值為20(可以想成我們這樣寫,會觸發到我們在centerX定義的set,此時設定的20會被代入newCenterX,因為這樣所以x = 20 - 10/2 = 15,所以第五行會跑出15的值)。
註1:如果在set後面我們沒有自行定義名稱newCenterX,則xcode預設是會變成newValue。
set {
x = newValue - width/2
}
註2:如果現在只有寫入get,而沒有set,則可以簡化成
var centerX:Double{
return x + width/2
}