CH10. 屬性與方法
10.1 儲存型屬性 前面章節所談到的,不管在類別或結構內的變數或常數皆為儲存 型屬性 (stored property) 。
範例程式 // store property struct Circle { var x, y: Int var radius = 10 } let cirObj = Circle(x: 10, y: 10, radius: 11) print("Circle:") print("x: \(cirObj.x), y: \(cirObj.y)") print("radius: \(cirObj.radius)")
輸出結果 Circle: x: 10, y: 10 radius: 11
10.2 計算型屬性 計算型屬性 (computed property) 不是真正儲存一值,取而代之的 是提供用以擷取的getter和選擇性的setter,用以間接設定某一屬 性值。
10.2.1 速記setter宣告 速記計算型屬性(shorthand setter declaration)將程式中set的參數 newCenter改用預設值newValue。
範例程式part1 // computer property struct Point { var x = 0.0, y = 0.0 } struct Side { var length = 0.0 struct Square { var originPoint = Point() var side = Side() var center: Point { get { let centerPointX = originPoint.x + side.length / 2 let centerPointY = originPoint.y + side.length / 2 return Point(x: centerPointX, y: centerPointY) set { originPoint.x = newValue.x - side.length / 2 originPoint.y = newValue.y - side.length / 2
範例程式part2 } var Obj = Square(originPoint: Point(x: 0.0, y: 0.0), side: Side(length: 10)) // call getter print("center x: \(Obj.center.x), y: \(Obj.center.y)") // call setter Obj.center = Point(x: 12, y: 12) print("original x: \(Obj.originPoint.x), y: \(Obj.originPoint.y)")
輸出結果 center x: 5.0, y: 5.0 original x: 7.0, y: 7.0
10.2.2 唯讀計算型屬性 唯讀計算型屬性(read-only computed property)表示只有get函式, 但沒有set 函式 。
範例程式 // read-only computed property struct cuboid { var width = 0.0, height = 0.0, depth = 0.0 var volume: Double { get{ return width * height * depth } let oneCuboid = cuboid(width: 2.0, height: 3.0, depth: 4.0) print("Volume is \(oneCuboid.volume)")
輸出結果 Volume is 24.0
10.3 屬性的觀察者 屬性的觀察者 (property observer) 將觀察和反應屬性值的變化。 屬性觀察者有二個函式: 10.3 屬性的觀察者 屬性的觀察者 (property observer) 將觀察和反應屬性值的變化。 屬性觀察者有二個函式: willSet,它在屬性值儲存之前將被呼叫。 didSet,它在新的值儲存後加以執行。
範例程式 // properties observers class YoursScore { var score: Int = 0 { willSet(newScore) { print("您的分數是 \(newScore)") } didSet { if score > oldValue { print("您進步了 \(score - oldValue) 分") } else { print("您退步了 \(oldValue - score) 分") let yourScore = YoursScore() yourScore.score = 60 yourScore.score = 80 yourScore.score = 70
輸出結果 您的分數是 60 您進步了 60 分 您的分數是 80
10.4 型態屬性 在結構內的屬性前皆加上static關鍵字,來形成型態屬性 不必建立物件,而只要以類別、結構或是列舉名稱來呼叫即可。
範例程式 // type property of struct struct Rectangle { static var width = 20 static var height = 30 static var property: String { return "Rectangle: " } print(Rectangle.property) print("Width: \(Rectangle.width)") print("Height: \(Rectangle.height)")
輸出結果 Rectangle: Width: 20 Height: 30
10.5 實例方法 實例方法 (instance method) 就是定義於類別或結構的方法。 必須使用物件來呼叫。
10.5.1 方法的參數名稱 方法參數名稱皆要在呼叫方法時加以列出。
範例程式 class Rectangle { var width = 0.0 var height = 0.0 func getArea() -> Double { return width * height } func setWidthAndHeight(w: Double, h: Double) { width = w height = h let rectObject = Rectangle() rectObject.setWidthAndHeight(w: 10, h: 20) let rectArea = rectObject.getArea() print("矩形面積: \(rectArea)")
輸出結果 矩形面積: 200.0
10.5.2 self屬性 Swift的self和C++ 與 Java的this關鍵字具有相同的意義,表示類別 本身。
10.5.3 從實例方法內修改值型態 結構和列舉的屬性是屬於值型態 (value type)。 值型態的屬性不可以在實例方法中被修改 。 10.5.3 從實例方法內修改值型態 結構和列舉的屬性是屬於值型態 (value type)。 值型態的屬性不可以在實例方法中被修改 。 若要修改,必須在方法前加上關鍵字mutating。
範例程式 // mutating keyword // 在setRadius函式前加上 mutating struct Circle { var radius = 0.0 func getArea() -> Double { return radius * radius * 3.14159 } mutating func setRadius(r: Double) { radius = r //物件一定要是var var circleObject = Circle() circleObject.setRadius(r: 10) let totalArea = circleObject.getArea() print("面積: \(totalArea)")
輸出結果 面積: 314.159
10.6 型態方法 本節將討論型態方法(type method) 。 10.6 型態方法 本節將討論型態方法(type method) 。 與實例方法的差異是,型態方法是共用的,有如C++ 或Java的 static方法。 可以使用類別名稱或結構名稱來呼叫,不必定義類別或類別的物 件來呼叫。
範例程式 // type method of class using class class Circle { var radius = 0.0 // type method class func printStar() { print("********") } func getArea() -> Double { return radius * radius * 3.14159 func setRadius(r: Double) { radius = r let circleObject = Circle() Circle.printStar() circleObject.setRadius(r: 10) let totalArea = circleObject.getArea() print("\(totalArea)")
輸出結果 ******* 面積: 314.159