【问题标题】:Custom typecasting自定义类型转换
【发布时间】:2015-12-09 04:30:00
【问题描述】:

如何在 Swift 中实现自定义类型转换?

似乎as 是一个可以对类进行自定义实现的运算符,但我找不到关于它的任何文档。

一个用例示例:可能希望从 Swift String 类型转换为自定义类,如 UCS4String,它实现了自己的方法和内部表示。

如果as 不能用于此目的,那么首选模式是什么?

【问题讨论】:

    标签: swift types casting swift2


    【解决方案1】:

    您只能将某些东西投射到它可能实际存在的东西上。例如,您可以将一个类转换为子类。 (例如,如果视图是 UIImageView 但您对它的引用以 UIView 引用开始,您可以使用 as! 运算符将其转换为 UIImageView。)但 String 不是类,因此不能向下转换以这种方式。

    同样,您不能在数字类型之间进行转换:例如,您不能将 Int 转换为 UInt,反之亦然。

    相反,您需要为您的类型提供一个 initializer,以便您可以强制基于旧实例将您的类型实例化。这就是您从 Int 获得 UInt 的方式:

    let i2 = UInt(i)
    

    在你的情况下:

    let s2 = UCS4String(string:s)
    

    【讨论】:

    • 仍然 let str:String = "swiftstring" let nstr = str as NString 工作正常。我认为问题是“我们可以覆盖 as 运算符吗?”
    • 但我的回答回答了这个问题。在幕后,String 和 NSString 是相同的类型,因此可以进行强制转换。 @user3441734
    • 幕后有相同的吗????嗯……我不同意。我可能是错的,但我很确定原生 String 和 Foundation NSString 类在本质上是不同的。转换操作符是在标准 swift 库中定义的,可能是现在,当开源 swift 可用时,我们可以检查源... 左右,现在我们不能重载转换操作符。
    • @user3441734 你可以“非常确定”任何你喜欢的东西。但是它们仍然相同。演员表没有改变底层存储。这就是为什么演员阵容是可能的。它们是桥接的。你可能想读我的书: 选角:apeth.com/swiftBook/ch04.html#_casting 桥接:apeth.com/swiftBook/…
    • String 作为 NSString 桥接到 Objective-C,而源自 Objective-C 的 String 可以将其字符存储在 NSString 中。由于 NSSString 的任意子类都可以成为字符串,因此在这种情况下,没有关于表示或效率的保证。
    猜你喜欢
    • 2022-11-23
    • 2022-01-22
    • 1970-01-01
    • 2021-07-20
    • 2014-03-04
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多