在 Swift 中,你甚至可以对协议进行扩展来提供它所要求的实现,或者是提供符合的类型能利用的其他附加功能。
扩展语法
下面是使用扩展的语法。
extensionSomeType{ // new functionality to add to SomeType goes here }
扩展可以让现有的类型实现新的协议。
extensionSomeType: SomeProtocol, AnotherProtocol{ // implementation of protocol requirements goes here }
计算属性
扩展可以给现有类型添加新的计算属性。下面的例子对 Swift 内置的 Double 类型添加了计算属性,实现对计算距离单位的基础支持。
extensionDouble{ var km: Double { returnself*1_000.0 } var m: Double { returnself } var cm: Double { returnself/100.0 } var mm: Double { returnself/1_000.0 } var ft: Double { returnself/3.28084 } } let oneInch =25.4.mm print("One inch is \(oneInch) meters") // Prints "One inch is 0.0254 meters" let threeFeet =3.ft print("Three feet is \(threeFeet) meters") // Prints "Three feet is 0.914399970739201 meters"
structSize{ var width =0.0, height =0.0 } structPoint{ var x =0.0, y =0.0 } structRect{ var origin =Point() var size =Size() }
由于 Rect 结构体给所有属性提供了默认值,所以它会收到一个默认的初始化器,以及一个按成员初始化器。你可以像下面这样创建 Rect 的新实例。
let defaultRect =Rect() let memberwiseRect =Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0))
你可以使用扩展给 Rect 添加指定的中点和尺寸属性。
extensionRect{ init(center: Point, size: Size) { let originX = center.x - (size.width /2) let originY = center.y - (size.height /2) self.init(origin: Point(x: originX, y: originY), size: size) } }
这个新的初始化器首先用拿到的参数计算出点的信息,然后调用结构体原本的初始化器进行初始化。
let centerRect =Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0)) // centerRect's origin is (2.5, 2.5) and its size is (3.0, 3.0)