首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展类型别名

扩展类型别名
EN

Stack Overflow用户
提问于 2014-10-24 12:51:06
回答 2查看 3.9K关注 0票数 8

我处理的是不同的单位,如distancealtitudespeedvolume等。

我的目标是有一种优雅的、独特的方式在应用程序中格式化它们,例如调用myValue.formatted

代码语言:javascript
复制
let mySpeed: Speed = 180
println(mySpeed.formatted) // 5.0 km/h

let myAltitude: Altitude = 4000
println(myAltitude.formatted) // 4000 m

我认为这是使用类型别名的一个很好的例子。

代码语言:javascript
复制
typealias Distance = Float
typealias Altitude = Float
typealias Speed = Float

对于formatted属性,我尝试使用类型为Floatextension

代码语言:javascript
复制
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

然后我尝试扩展单个类型:

代码语言:javascript
复制
extension Speed {
  var formatted: String {
    return "\(self * 3.6) km/h"
  }
}
extension Altitude {
  var formatted: String {
    return "\(self) m"
  }
}

编译器现在清楚地声明了“格式化”的无效重声明。

好的,现在很清楚类型别名是如何工作的。但是我如何为不同类型的浮标快速获得我的.formatted属性呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-24 13:45:14

typealias只需更改或重命名类型。它不会为您创建其他用户类型。实际上,您正在将Float扩展为SpeedAltitude

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

代码语言:javascript
复制
let mySpeed: Speed = 180

FloatLiteralConvertibleIntegerLiteralConvertible将为您提供所需的相同功能,您可以像分配给Float一样直接为自定义struct types分配值。

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2014-10-24 13:06:59

DistanceAltitudeSpeed始终是相同的类型- Float,并且共享相同的formatted属性。编译器是这样看待您的代码的:

代码语言:javascript
复制
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)"
            }
        }
    }
}

我想您需要为您的功能创建小包装:

代码语言:javascript
复制
struct Distance {
    var value: Float
    var formatted: String {
        return "\(value) m"
    }

    init(_ value: Float) {
        self.value = value
    }
}

let myDistance = Distance(123)
myDistance.formatted
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26548254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档