• 赚钱入口【需求资源】限时招募流量主、渠道主,站长合作;【合作模式】CPS长期分成,一次推广永久有收益。主动打款,不扣量;

swift中的as,as?,as!

iOS cps12345 1年前 (2020-07-05) 243次浏览 0个评论

swift中的泛型转换符号as,as?,as!之间有什么区别呢?先让我们看下如下的情形:

4 as Double // fine
4 as! Double // crashes

你可能认为as!在as使用成功的地方永远不会失败,但实际上这两个符号是有区别的。

as?和as!是运行时符号

as?和as!是运行时向下转换符号,程序运行时,4示例中的表达式已被分配为type Int结果,Double由于DoubleInt类型是不相关的类型,因此强制转换失败(而Swift通常避免使用数字类型之间的隐式转换)。

如果我们使用as?而不是as!,编译器会提示徒劳的提示:

4 as? Double // warning: Conditional downcast from literal to 'Double'
             // always fails; consider using 'as' coercion

as?并且as!是相同的操作,唯一的不同是as!强制解开结果。这两行是等效的:

x as! Y
(x as? Y)!

as 在编译时强制类型转换

as 在编译时进行强制类型转换,上例中的强制转换成功原因在于4这时是作为文字(Literals)而不是Int,所以可以强制转换为Double.

Literals(文字)没有固定的类型,4可以被认为实现了ExpressibleByIntegerLiteral的任何类型,这里… as Double指令指示编译器使用Double的一致性,就像其他任何隐式或显式类型注释一样。这两行是等效的

let x = 4 as Double
let x: Double = 4

在模式匹配使用时,as是运行时操作

语法上的细微差别:as在模式匹配上下文中使用时,检查在运行时执行(必须执行)。例:

let value: Any = 
switch value {
case let i as Int: 
case let s as String: 
}

as模式是在意义上更接近as?as!

喜欢 (0)

您必须 登录 才能发表评论!