我正在处理不同的单位,即 distance
、altitude
、speed
、volume
等。
我的目标是用一种优雅、独特的方式在应用程序中格式化它们,例如调用 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
:
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
block 总是 true
。
然后我尝试扩展单一类型:
extension Speed {
var formatted: String {
return "\(self * 3.6) km/h"
}
}
extension Altitude {
var formatted: String {
return "\(self) m"
}
}
编译器现在清楚地指出“格式化”的重新声明无效
好的,现在类型别名的工作原理很清楚了。但是我如何在 swift 中为不同类型的 Floats 获取我的 .formatted
属性?
最佳答案
typealias
只是改变或重命名类型。它不会为您创建另一种用户类型。您实际上是在为 Speed
、Altitude
再次扩展 Float
。
您可以通过符合 Literals
类型将 180
传递给您的自定义结构。
let mySpeed: Speed = 180
FloatLiteralConvertible
和 IntegerLiteralConvertible
将为您提供您想要的相同功能,您可以直接将值分配给您的自定义 struct types
,就像您分配给 float
struct Speed: FloatLiteralConvertible,IntegerLiteralConvertible {
var distance:Float
init(floatLiteral value: Float) {
distance = value
}
init(integerLiteral value: Int){
distance = Float(value)
}
var formatted: String {
return "\(distance * 3.6) km/h"
}
}
let mySpeed: Speed = 180.0
println(mySpeed.formatted) // 5.0 km/h
关于ios - 在 swift 中扩展类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548254/