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