as
- >中替换几十个地方as!
。为什么,现在的规则是什么?
答案 0 :(得分:5)
在Swift 1.2之前,as
运算符可用于执行两种不同类型的转换,具体取决于要转换的表达式的类型以及转换为的类型:
保证转换一种类型的值到另一种类型,其成功可由Swift编译器验证。例如,向上转换(即,从类转换为其超类之一)或指定文字表达式的类型(例如,1作为Float)。
强制转换一个值到另一个值,Swift编译器无法保证其安全性,并且可能导致运行时陷阱。例如,向下转换,从类转换为其子类之一。
Swift 1.2将保证转换和强制转换的概念分为两个不同的运算符。仍然使用as
运算符执行保证转换,但强制转换现在使用as!
运算符。 !
表示转换可能会失败。通过这种方式,您可以快速了解哪些转换可能导致程序崩溃。
答案 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)
保证转换和“强制可用”转换的概念 现在分为两个运营商。现在强制可转换 使用as!运营商。的!向读者清楚地表明了这一点 强制转换可能会失败并产生运行时错误。 “as”运算符 保留为upcast(例如“someDerivedValue as Base”)并输入 注释(“0 as Int8”)保证永不失败。