扩展可以给现有类型添加计算型实例属性和计算型类属性。这个例子给 Swift 内建的 Double
类型添加了五个计算型实例属性,从而提供与距离单位相关工作的基本支持:
extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
// 打印“One inch is 0.0254 meters”
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
// 打印“Three feet is 0.914399970739201 meters”
这些计算型属性表示的含义是把一个 Double
值看作是某单位下的长度值。即使它们被实现为计算型属性,但这些属性的名字仍可紧接一个浮点型字面值,从而通过点语法来使用,并以此实现距离转换。
在上述例子中,Double
类型的 1.0
代表的是“一米”。这就是为什么计算型属性 m
返回的是 self
——表达式 1.m
被认为是计算一个 Double
类型的 1.0
。
其它单位则需要一些单位换算。一千米等于 1,000 米,所以计算型属性 km
要把值乘以 1_000.00
来实现千米到米的单位换算。类似地,一米有 3.28084 英尺,所以计算型属性 ft
要把对应的 Double
值除以 3.28084
,来实现英尺到米的单位换算。
这些属性都是只读的计算型属性,所以为了简便,它们的表达式里面都不包含 get
关键字。它们使用 Double
作为返回值类型,并可用于所有接受 Double
类型的数学计算中:
let aMarathon = 42.km + 195.m
print("A marathon is \(aMarathon) meters long")
// 打印“A marathon is 42195.0 meters long”
注意
扩展可以添加新的计算属性,但是它们不能添加存储属性,或向现有的属性添加属性观察者。