我处理的是不同的单位,如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块总是true。
然后我尝试扩展单个类型:
extension Speed {
var formatted: String {
return "\(self * 3.6) km/h"
}
}
extension Altitude {
var formatted: String {
return "\(self) m"
}
}编译器现在清楚地声明了“格式化”的无效重声明。
好的,现在很清楚类型别名是如何工作的。但是我如何为不同类型的浮标快速获得我的.formatted属性呢?
发布于 2014-10-24 13:45:14
typealias只需更改或重命名类型。它不会为您创建其他用户类型。实际上,您正在将Float扩展为Speed,Altitude。
您可以通过符合180类型将Literals传递给自定义结构。
let mySpeed: Speed = 180FloatLiteralConvertible和IntegerLiteralConvertible将为您提供所需的相同功能,您可以像分配给Float一样直接为自定义struct types分配值。
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发布于 2014-10-24 13:06:59
Distance、Altitude和Speed始终是相同的类型- Float,并且共享相同的formatted属性。编译器是这样看待您的代码的:
extension Float {
var formatted: String {
get {
switch self {
case is Float:
return "\(self) m"
case is Float:
return "\(self * 3.6) km/h"
default:
return "\(self)"
}
}
}
}我想您需要为您的功能创建小包装:
struct Distance {
var value: Float
var formatted: String {
return "\(value) m"
}
init(_ value: Float) {
self.value = value
}
}
let myDistance = Distance(123)
myDistance.formattedhttps://stackoverflow.com/questions/26548254
复制相似问题