新的用途是什么!运营商有?

时间:2015-02-28 18:53:33

标签: swift operators downcast

我不太明白as!运算符应添加的新功能 Apple's documentation说:

  

as!运算符将表达式强制转换为指定类型。 as!运算符返回指定类型的值,而不是可选类型。如果强制转换失败,则会引发运行时错误。 x as! T的行为与(x as? T)!的行为相同。

似乎使用as!只有在知道向下转换成功时才有意义,因为否则会触发运行时错误。但是,当我知道向下转换成功时,我只使用as运算符。由于as!as都没有返回可选项,因此它们甚至返回完全相同的类型 也许我错过了什么,但有什么意义呢?

2 个答案:

答案 0 :(得分:3)

在某些情况下,您作为程序员可以知道as会成功,但编译器无法确定它。在这种情况下,as是编译时错误,但as!将编译。

答案 1 :(得分:3)

as(无爆炸)运算符适用于语言保证成功的强制转换 - 主要是,这意味着从子类型转换为其祖先类型之一。

as!as?运算符适用于语言无法保证成功的强制转换。当您具有常规类型并希望将其视为更具体的子类型时,这会发挥作用。编译器不知道哪个子类型可能真正隐藏在一般类型后面 - 可以在运行时决定信息 - 因此,只要语言知道,就有可能导致失败。

as?as!之间的区别在于如何处理失败。使用前者,演员表的结果会被包含在一个可选项中,迫使您为了失败而使用酵母,并允许您以对您的应用程序有意义的方式处理它。后者假定演员阵容会成功,所以你不会被迫检查失败 - 如果你的假设结果是错误的话,你就会崩溃。

那么为什么要使用as!?它与Implicitly Unwrapped Optional扮演相同的角色:你可以使用它(风险自负)以防某些行为被保证"通过语言外部的某些因素(即使语言本身无法保证),允许您跳过编写代码来测试您不希望发生的失败。最常见的情况之一是,当您依赖于另一个类的运行时行为时 - 该语言不会说subviews的{​​{1}}数组必须包含其他类UIView,但它的文档向您保证它会。

在Swift 1.2之前,没有UIView - as!包含可能崩溃的案例和无法解决的案例。新操作员要求您明确自己是否正在做总是成功的事情,您期望始终成功的事情,以及您打算测试的事情失败。