我不太明白as!
运算符应添加的新功能
Apple's documentation说:
as!
运算符将表达式强制转换为指定类型。as!
运算符返回指定类型的值,而不是可选类型。如果强制转换失败,则会引发运行时错误。x as! T
的行为与(x as? T)!
的行为相同。
似乎使用as!
只有在知道向下转换成功时才有意义,因为否则会触发运行时错误。但是,当我知道向下转换成功时,我只使用as
运算符。由于as!
和as
都没有返回可选项,因此它们甚至返回完全相同的类型
也许我错过了什么,但有什么意义呢?
答案 0 :(得分:3)
在某些情况下,您作为程序员可以知道as
会成功,但编译器无法确定它。在这种情况下,as
是编译时错误,但as!
将编译。
答案 1 :(得分:3)
as
(无爆炸)运算符适用于语言保证成功的强制转换 - 主要是,这意味着从子类型转换为其祖先类型之一。
as!
和as?
运算符适用于语言无法保证成功的强制转换。当您具有常规类型并希望将其视为更具体的子类型时,这会发挥作用。编译器不知道哪个子类型可能真正隐藏在一般类型后面 - 可以在运行时决定信息 - 因此,只要语言知道,就有可能导致失败。
as?
和as!
之间的区别在于如何处理失败。使用前者,演员表的结果会被包含在一个可选项中,迫使您为了失败而使用酵母,并允许您以对您的应用程序有意义的方式处理它。后者假定演员阵容会成功,所以你不会被迫检查失败 - 如果你的假设结果是错误的话,你就会崩溃。
那么为什么要使用as!
?它与Implicitly Unwrapped Optional扮演相同的角色:你可以使用它(风险自负)以防某些行为被保证"通过语言外部的某些因素(即使语言本身无法保证),允许您跳过编写代码来测试您不希望发生的失败。最常见的情况之一是,当您依赖于另一个类的运行时行为时 - 该语言不会说subviews
的{{1}}数组必须包含其他类UIView
,但它的文档向您保证它会。
在Swift 1.2之前,没有UIView
- as!
包含可能崩溃的案例和无法解决的案例。新操作员要求您明确自己是否正在做将总是成功的事情,您期望始终成功的事情,以及您打算测试的事情失败。