Swift計算型屬性
計算型屬性(Computed Properties)
擴展可以向已有類型添加計算型實例屬性和計算型類型屬性。下麵的例子向 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)。