ios - 在 swift 中扩展类型别名

标签 ios swift

我正在处理不同的单位,即 distancealtitudespeedvolume 等。

我的目标是用一种优雅、独特的方式在应用程序中格式化它们,例如调用 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 只是改变或重命名类型。它不会为您创建另一种用户类型。您实际上是在为 SpeedAltitude 再次扩展 Float

您可以通过符合 Literals 类型将 180 传递给您的自定义结构。

let mySpeed: Speed = 180

FloatLiteralConvertibleIntegerLiteralConvertible 将为您提供您想要的相同功能,您可以直接将值分配给您的自定义 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/

相关文章:

ios - 滚动动画期间 Swift UITableView 滑动

ios - 如何使用自动布局更改标签位置

Swift:在后台同步执行代码; queue.sync 没有像我预期的那样工作

swift - 如何对元组中的所有元素求和

ios - 有什么方法可以获取现有 AVAsset 的资源名称?

ios - 对 Segment 使用约束时发生冲突

ios - 查询从 google 获取搜索结果... iOS

iOS:如何在我的应用程序中实现 Accordion (下拉)UI,如图所示?

ios - 单击按钮时快速创建角度,但方向相反

swift - 我可以在 Realm Swift 中拥有异构集合吗?