標籤:des c style class a color
在Swift中,函數實際上是一種特殊的組合體(閉包),你也可以定義匿名的組合體(閉包),將代碼寫在({})中,並使用in 來分隔參數和傳回值.
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
EXPERIMENT // 練習題
Rewrite the closure to return zero for all odd numbers. // 重寫編寫一個組合體,傳回值為0;
為了更精確的使用組合體(閉包),你可以有幾種選擇.當類型是明確的時候,比如代理的回呼函數,你可以忽略它的參數的類型,以及傳回值類型.單語句的組合體,隱式的返回它執行語句的值.
numbers.map({ number in 3 * number })
參數的指定使用數字取代名稱,這個方法對於非常簡短的組合體(閉包)特別適用. 一個組合體(閉包)作為函數的最後參數傳遞值的時候,可以緊跟在()後面.
sort([1, 5, 3, 12, 2]) { $0 > $1 }
Objects and Classes
/*對象和類*/
在Swift中,使用class關鍵字再加上類名來建立一個類.類中的成員/屬性聲明方法與之前的常量/變數聲明一樣,只是它們必須在類的定義內.同樣,方法和函數也是如此.
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
EXPERIMENT // 練習題
Add a constant property with let, and add another method that takes an argument. //使用let添加一個常量屬性,再添加一個帶有參數的方法;
建立類的執行個體是在類名的後面加一個(),訪問執行個體方法和執行個體成員使用點文法.
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
在上面的代碼例子中,shape類缺少了一個非常重要的事情:當執行個體建立的時候,沒有初始化.使用init可以建立一個初始化的執行個體.
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
注意上述代碼中,self是怎樣在初始化中區分name屬性與name參數的.建立一個類的執行個體時,參數name的傳遞就像函數調用時一樣.每個屬性成員都需要分配一個值無論是在聲明中還是在初始化裡.
使用 deinit 定義一個登出對象的方法,在這個方法裡你可以在對象被銷毀前執行一些清理事情.
子類的寫法是在類名後面使用:再加上父類的名稱.在Swift中,不在要求子類必須有基礎的根類,因此在恰當的時候,你可以根據情況需要添加或者去掉父類.
子類的方法可以覆蓋(重寫)父類中標記的 override的方法,如果覆蓋(重寫)了父類中沒有標記override的方法,編譯器會直接報錯.編譯器也會檢測子類中標記為 override的方法,即使這個方法不是重載自父類.
class Square: NamedShape {
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length \(sideLength)."
}
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()
EXPERIMENT // 練習題
Make another subclass of NamedShape called Circle that takes a radius and a name as arguments to its initializer. Implement an area and a describe method on the Circle class.
/**設計一個繼承NamedShape類的子類Circle,並初始化它的成員變數radius和name,再給類添加area和describe方法*/
類的另一種簡便存取成員變數的方式是,使用setter和getter.
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triagle with sides of length \(sideLength)."
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength
在上述代碼例子中,成員變數perimeter的setter方法有一個隱含的變數 newValue,也可以在set後添加(),在其中明顯的定義這個變數.
注意在 EquilateralTriangle類中 初始化有三個不同的步驟:
- 設定子類聲明的成員變數的值;
- 調用父類的初始化;
- 修改父類定義的成員變數值,以及其他的一些使用getter或者setter再或者執行個體方法來完成的工作.
/*************後續內容,敬請期待***********/