由于Swift严格检查类型,有时我们需要在NSString和String,NSArray和[AnyObject]等之间进行转换。但实际上有两种不同的方法可以做到这一点:
str as String
String(str)
在Swift中更推荐哪个?为什么呢?
答案 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)
// ...
}