Swift Extension 擴充套件
阿新 • • 發佈:2019-02-09
Swift 裡的Extension 和 OC 裡的Catagory 差不多,很多細節會有差異,註釋已寫在程式碼裡,請看註釋
struct Point { var x = 0.0 var y = 0.0 } struct Size { var width = 0.0 var height = 0.0 } class Rectangle { var origin = Point() var size = Size() init(origin: Point, size: Size) { self.origin = origin self.size = size } } // 擴充套件方法 extension Rectangle { func translate(x: Double, y: Double) -> Void { self.origin.x += x self.origin.y += y } } // Swift 只能擴充套件計算型的屬性,不能擴充套件儲存型的屬性 extension Rectangle { var center: Point { get { let x = self.origin.x + self.size.width/2 let y = self.origin.y + self.size.height/2 return Point(x: x, y: y) } set{ self.origin.x = newValue.x - self.size.width/2 self.origin.y = newValue.y - self.size.height/2 } } // 只能擴充套件便利型的建構函式 convenience init(center: Point, size: Size) { self.init(origin: Point(x: center.x - size.width/2, y: center.y - size.height/2), size: size) } //var borderWidth:Double = 1.0 // 宣告一個邊框的屬性直接報錯 Extension may not contain stored properties } // 巢狀列舉型別 extension Rectangle { enum Vertex { case leftTop case rightTop case leftBottom case rightBottom } func getPointWithVertex(vertex: Vertex) -> Point { switch vertex { case .leftTop: return self.origin case .rightTop: let x = self.origin.x + self.size.width; let y = self.origin.y return Point(x: x, y: y); case .leftBottom: let x = self.origin.x let y = self.origin.y + self.size.height return Point(x: x, y: y); case .rightBottom: let x = self.origin.x + self.size.width; let y = self.origin.y + self.size.height return Point(x: x, y: y); } } } var rect = Rectangle(origin: Point(x: 0, y: 0), size: Size(width: 10, height: 10)) print(rect.getPointWithVertex(vertex: Rectangle.Vertex.rightBottom)) // 兩種方式都可以 ectangle.Vertex.rightBottom .Vertex.rightBottom print(rect.getPointWithVertex(vertex: .rightTop))
上面程式碼執行結果:
Point(x: 10.0, y: 10.0)
Point(x: 10.0, y: 0.0)
可以給系統的原有型別做擴充套件
// double 的擴充套件 extension Double{ var km: Double { return self * 1000.0 } var m:Double { return self } var cm: Double { return self/100.0 } var ft: Double { return self/3.2804 } } let runningDistance: Double = 5.00.km print(runningDistance)
執行結果:
5000.0