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

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

问题描述:

什么是当前在Swift中定义显式转换的最佳/首选方式?我的头顶,我可以想到两个:在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协议的反转。

子问题:这两种方法都不允许这样的事情编译:let s: MyString = myTypeInstance (as String)(括号内为选装件),但如果我的理解对不对,该as运营商只对类型层次结构中向下转型,是,正确?

swift中使用的模式是初始值设定项。因此,例如转换的IntUInt的时候,我们必须写:

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

我要坚持这种模式。

至于subquestion,文档指出:

Type casting is a way to check the type of an instance, and/or to treat that instance as if it is a different superclass or subclass from somewhere else in its own class hierarchy.

You can also use type casting to check whether a type conforms to a protocol

所以没有,则as关键字`吨被用于转化某些类型的值到另一个类型。

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

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

生成错误:

'Int' is not convertible to 'UInt' 

更多Type Casting

+0

好的,谢谢。包括文档在内也很好。我认为为转换提供内置类型的扩展也是正确的做法? – Kolja 2014-08-30 19:45:29

+1

是的,当我们添加到第三方类型时,扩展是我们手中的工具。对于我们自己的代码,这当然只是一个偏好问题。在某些情况下,使用扩展可以帮助保持我们的代码更有组织性,更易于浏览。 – Antonio 2014-08-30 19:49:14

+1

再次感谢。现在我只需要隐式转换,但是我不会从Swift中获得。 ;-) – Kolja 2014-08-30 20:21:11