发布于 2015-06-14 01:50:44 | 227 次阅读 | 评论: 0 | 来源: 网络整理
扩展可以向已有类型添加计算型实例属性和计算型类型属性。下面的例子向 Swift 的内建Double
类型添加了5个计算型实例属性,从而提供与距离单位协作的基本支持。
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
println("One inch is (oneInch) meters")
// 打印输出:"One inch is 0.0254 meters"
let threeFeet = 3.ft
println("Three feet is (threeFeet) meters")
// 打印输出:"Three feet is 0.914399970739201 meters"
这些计算属性表达的含义是把一个Double
型的值看作是某单位下的长度值。即使它们被实现为计算型属性,但这些属性仍可以接一个带有dot语法的浮点型字面值,而这恰恰是使用这些浮点型字面量实现距离转换的方式。
在上述例子中,一个Double
型的值1.0
被用来表示“1米”。这就是为什么m
计算型属性返回self
——表达式1.m
被认为是计算1.0
的Double
值。
其它单位则需要一些转换来表示在米下测量的值。1千米等于1,000米,所以km
计算型属性要把值乘以1_000.00
来转化成单位米下的数值。类似地,1米有3.28024英尺,所以ft
计算型属性要把对应的Double
值除以3.28024
来实现英尺到米的单位换算。
这些属性是只读的计算型属性,所有从简考虑它们不用get
关键字表示。它们的返回值是Double
型,而且可以用于所有接受Double
的数学计算中:
let aMarathon = 42.km + 195.m
println("A marathon is (aMarathon) meters long")
// 打印输出:"A marathon is 42495.0 meters long"
注意:
扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器(property observers)。