如! vs作为Swift中Xcode 6.3的运算符

时间:2015-04-16 12:39:18

标签: swift casting

使用Xcode 6.3,Swift发生了很大的变化。我必须在我的每个应用as - >中替换几十个地方as!。为什么,现在的规则是什么?

3 个答案:

答案 0 :(得分:5)

在Swift 1.2之前,as运算符可用于执行两种不同类型的转换,具体取决于要转换的表达式的类型以及转换为的类型:

  • 保证转换一种类型的值到另一种类型,其成功可由Swift编译器验证。例如,向上转换(即,从类转换为其超类之一)或指定文字表达式的类型(例如,1作为Float)。

  • 强制转换一个值到另一个值,Swift编译器无法保证其安全性,并且可能导致运行时陷阱。例如,向下转换,从类转换为其子类之一。

Swift 1.2将保证转换和强制转换的概念分为两​​个不同的运算符。仍然使用as运算符执行保证转换,但强制转换现在使用as!运算符。 !表示转换可能会失败。通过这种方式,您可以快速了解哪些转换可能导致程序崩溃。

来源:https://developer.apple.com/swift/blog/?id=23

答案 1 :(得分:1)

实际差异在于:

var optionalString = dict.objectForKey("SomeKey") as? String

optionalString将是String?类型的变量。如果基础类型不是String,则无害地将nil分配给可选项。

var optionalString = dict.objectForKey("SomeKey") as! String?

这就是说,我知道这件事是String?。这也会导致optionalString属于String?类型,但如果基础类型是其他类型,它将会崩溃。

然后第一个样式与if let一起使用以安全地打开可选的:

if let string = dict.objectForKey("SomeKey") as? String {
    // If I get here, I know that "SomeKey" is a valid key in the dictionary, I correctly
    // identified the type as String, and the value is now unwrapped and ready to use.  In
    // this case "string" has the type "String".
    println(string)
}

答案 2 :(得分:0)

根据release notes

  

保证转换和“强制可用”转换的概念   现在分为两个运营商。现在强制可转换   使用as!运营商。的!向读者清楚地表明了这一点   强制转换可能会失败并产生运行时错误。 “as”运算符   保留为upcast(例如“someDerivedValue as Base”)并输入   注释(“0 as Int8”)保证永不失败。