在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中使用的模式是初始值设定项。因此,例如转换的Int
到UInt
的时候,我们必须写:
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'
好的,谢谢。包括文档在内也很好。我认为为转换提供内置类型的扩展也是正确的做法? – Kolja 2014-08-30 19:45:29
是的,当我们添加到第三方类型时,扩展是我们手中的工具。对于我们自己的代码,这当然只是一个偏好问题。在某些情况下,使用扩展可以帮助保持我们的代码更有组织性,更易于浏览。 – Antonio 2014-08-30 19:49:14
再次感谢。现在我只需要隐式转换,但是我不会从Swift中获得。 ;-) – Kolja 2014-08-30 20:21:11