类型转换或初始化,这在Swift中更好?

时间:2015-11-28 16:37:00

标签: swift

由于Swift严格检查类型,有时我们需要在NSString和String,NSArray和[AnyObject]等之间进行转换。但实际上有两种不同的方法可以做到这一点:

  1. 类型转换,例如str as String
  2. 初始化,例如String(str)
  3. 在Swift中更推荐哪个?为什么呢?

1 个答案:

答案 0 :(得分:8)

你在谈论铸造与强制。这不是#34;推荐"的问题。它们完全不同。

  • Casting 只是一种向编译器重新编写内容的方法。您的重新描述必须是真实的,否则您将在运行时崩溃。

    例如,您可以将AnyObject强制转换为字符串(as!),以防 为字符串;您只是告诉编译器,然后您可以向此对象发送与字符串相关的消息。强制转换是合法的,因为String桥接到NSString,NSString是AnyObject,所以这个 AnyObject可能确实是一个String。但是,如果你撒谎并且是一个字符串,那么当应用程序运行时你会崩溃,并且你试图将一些事实上已经不是String的字符串转换为String。

  • 强制完全成为一个新对象。它仅适用于新类型具有接受旧对象的初始值设定项的情况。

    例如,您无法在Swift中的数值类型之间进行转换。你必须强迫,这是一个完全不同的东西 - 也就是说,你必须根据原始对象创建一个不同数字类型的新对象。使用期望UInt8的Int8的唯一方法是强制它:UInt8(x)。这是合法的,因为UInt8有一个Int8初始化程序(正如你在Swift标题中看到的那样):

    extension UInt8 {
        public init(_ v: Int8)
        // ...
    }