擴(kuò)展可以向已有類型添加計(jì)算型實(shí)例屬性和計(jì)算型類型屬性。下面的例子向 Swift 的內(nèi)建Double類型添加了5個(gè)計(jì)算型實(shí)例屬性,從而提供與距離單位協(xié)作的基本支持。
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"
這些計(jì)算屬性表達(dá)的含義是把一個(gè)Double型的值看作是某單位下的長(zhǎng)度值。即使它們被實(shí)現(xiàn)為計(jì)算型屬性,但這些屬性仍可以接一個(gè)帶有dot語(yǔ)法的浮點(diǎn)型字面值,而這恰恰是使用這些浮點(diǎn)型字面量實(shí)現(xiàn)距離轉(zhuǎn)換的方式。
在上述例子中,一個(gè)Double型的值1.0被用來(lái)表示“1米”。這就是為什么m計(jì)算型屬性返回self——表達(dá)式1.m被認(rèn)為是計(jì)算1.0的Double值。
其它單位則需要一些轉(zhuǎn)換來(lái)表示在米下測(cè)量的值。1千米等于1,000米,所以km計(jì)算型屬性要把值乘以1_000.00來(lái)轉(zhuǎn)化成單位米下的數(shù)值。類似地,1米有3.28024英尺,所以ft計(jì)算型屬性要把對(duì)應(yīng)的Double值除以3.28024來(lái)實(shí)現(xiàn)英尺到米的單位換算。
這些屬性是只讀的計(jì)算型屬性,所有從簡(jiǎn)考慮它們不用get關(guān)鍵字表示。它們的返回值是Double型,而且可以用于所有接受Double的數(shù)學(xué)計(jì)算中:
let aMarathon = 42.km + 195.m
println("A marathon is \(aMarathon) meters long")
// 打印輸出:"A marathon is 42495.0 meters long"
注意:
擴(kuò)展可以添加新的計(jì)算屬性,但是不可以添加存儲(chǔ)屬性,也不可以向已有屬性添加屬性觀測(cè)器(property observers)。