在Swift中为自定义类型定义显式转换

时间:2014-08-30 19:10:59

标签: swift type-conversion

目前在Swift中定义显式转换的最佳/首选方式是什么?在我的头脑中,我可以想到两个:

  • 通过扩展程序为目标类型创建自定义初始值设定项,如下所示:

    extension String {
      init(_ myType: MyType) {
        self = "Some Value"
      }
    }
    

    这样,您可以使用String(m),其中m是MyType类型,将m转换为字符串。

  • 定义toType - 源类型中的方法,如下所示:

    class MyType {
      func toString() -> String {
        return "Some Value"
      }
    }
    

    这与Swift的String.toInt()相当,后者返回Int?。但如果这是确定的方法,我希望有基本类型的协议,比如已经存在的*LiteralConvertible协议的反转。

子问题:这两个方法中没有一个允许这样的东西编译:{{1​​}}(括号中的部分可选),但如果我理解正确,let s: MyString = myTypeInstance (as String)运算符仅适用于类型中的向下转换层次结构,这是正确的吗?

1 个答案:

答案 0 :(得分:9)

swift中使用的模式是初始化程序。例如,在将Int转换为UInt时,我们必须写:

var i: Int = 10
var u: UInt = UInt(i)

我会坚持这种模式。

至于子问题,文件说明:

  

类型转换是一种检查实例类型的方法,和/或将该实例视为与其自己的类层次结构中的其他位置不同的超类或子类。

  

您还可以使用类型转换来检查类型是否符合协议

所以不,as关键字不能用于将某种类型的值转换为另一种类型。

可以通过简单的方式进行测试:

var i: Int = 10
var u: UInt = i as UInt

这会产生错误:

'Int' is not convertible to 'UInt'

有关Type Casting

的更多信息