我正在处理不同的单位,例如距离
、高度
、速度
、体积
等。
我的目标是在应用程序中以优雅且独特的方式格式化它们,例如调用myValue.formatted
:
let mySpeed: Speed = 180
println(mySpeed.formatted) // 5.0 km/h
let myAltitude: Altitude = 4000
println(myAltitude.formatted) // 4000 m
我认为这是使用类型别名的一个好例子。
typealias Distance = Float
typealias Altitude = Float
typealias Speed = Float
对于formatted
属性,我尝试使用类型为Float
的扩展:
extension Float {
var formatted: String {
get {
switch self {
case is Altitude:
return "\(self) m"
case is Speed:
return "\(self * 3.6) km/h"
default:
return "\(self)"
}
}
}
}
但编译器说我的
case
块总是为 true
。然后我尝试扩展单个类型:
extension Speed {
var formatted: String {
return "\(self * 3.6) km/h"
}
}
extension Altitude {
var formatted: String {
return "\(self) m"
}
}
编译器现在明确声明“formatted”无效的重新声明。
好的,现在我们清楚了类型别名的工作原理。但是,在Swift中,我如何为不同类型的浮点数获取我的“ .formatted ”属性呢?
floatVar
强制转换为Speed
,即使用as
关键字。类型别名以这种方式很优雅。 - gpblFloat
了,它是用户自定义的自定义类型。你可以使用一个函数和一种格式来format
Float
。如果你真的想这样做,在扩展中使用formatSpeed
和formatDistance
。 - codester