ios – 在swift中扩展类型别名

ios – 在swift中扩展类型别名,第1张

概述我正在处理不同的单位,即距离,高度,速度,音量等. 我的目标是在应用程序中使用一种优雅,独特的方式来格式化它们,例如调用myValue.formatted: let mySpeed: Speed = 180println(mySpeed.formatted) // 5.0 km/hlet myAltitude: Altitude = 4000println(myAltitude.forma 我正在处理不同的单位,即距离,高度,速度,音量等.

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

let mySpeed: Speed = 180println(mySpeed.formatted) // 5.0 km/hlet myAltitude: Altitude = 4000println(myAltitude.formatted) // 4000 m

我认为这是使用类型别名的好例子.

typealias distance = floattypealias Altitude = floattypealias Speed = float

对于格式化的属性,我尝试使用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块总是正确的.

然后我试图扩展单一类型:

extension Speed {  var formatted: String {    return "\(self * 3.6) km/h"  }}extension Altitude {  var formatted: String {    return "\(self) m"  }}

编译器现在明确说明’格式化’的重新声明无效

好的,现在很清楚类型别名是如何工作的.但是如何在swift中为不同类型的floats获取我的.formatted属性?

解决方法 typealias只是更改或重命名类型.它不会为您创建其他用户类型.你实际上是再次扩展float for Speed,Altitude.

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

let mySpeed: Speed = 180

floatliteralConvertible和IntegerliteralConvertible将为您提供所需的相同功能,您可以在分配给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.0println(mySpeed.formatted) // 5.0 km/h
总结

以上是内存溢出为你收集整理的ios – 在swift中扩展类型别名全部内容,希望文章能够帮你解决ios – 在swift中扩展类型别名所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1107525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存