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

yzy*_*sun 1 swift

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

  1. 类型转换,如 str as String
  2. 初始化,如String(str)

在Swift中更推荐哪个?为什么?

mat*_*att 9

你在谈论铸造与强制.这不是"推荐"的问题.它们是完全不同的东西.

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

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

  • 强制完全成为一个新的对象.它仅适用于新类型具有接受旧对象的初始化程序的情况.

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

    extension UInt8 {
        public init(_ v: Int8)
        // ...
    }
    
    Run Code Online (Sandbox Code Playgroud)