new as 有什么用!运营商有?

What use does the new as! operator have?

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

The as! operator performs a forced cast of the expression to the specified type. The as! operator returns a value of the specified type, not an optional type. If the cast fails, a runtime error is raised. The behavior of x as! T is the same as the behavior of (x as? T)!.

似乎使用 as! 才有意义,当你知道向下转换会成功时,否则会触发运行时错误。但是当我知道向下转换会成功时,我只使用 as 运算符。而且由于 as!as return 都不是可选的,它们甚至 return 完全相同的类型。
也许我遗漏了什么,但这有什么意义呢?

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

as(无爆炸)运算符用于 由语言 保证成功的转换 — 主要是,这意味着从一个子类型到它的一个子类型的转换祖先类型。

as!as? 运算符用于语言无法保证会成功的转换。当您拥有通用类型并希望将其视为更具体的子类型时,这就会发挥作用。编译器不知道哪个子类型可能真正隐藏在一般类型之后——该信息可以在 运行 时间决定——所以就语言所知,转换有可能失败。

as?as! 的区别在于处理失败的方式。对于前者,强制转换的结果被包裹在一个可选中,迫使您为失败做准备,并允许您以对您的应用程序有意义的方式处理它。后者假设转换会成功,因此您不必检查是否失败——如果您的假设被证明是错误的,您只会崩溃。

那么为什么要使用 as!?它扮演与隐式解包选项相同的角色:您可以使用它(风险自负)用于某些行为由于语言外部的某些因素 "guaranteed" 的情况(即使语言本身不能保证) ),让您不必编写代码来测试您不希望发生的故障。最常见的情况之一是当您依赖于另一个 class 的 运行 时间行为时 — 语言并没有说 subviews 数组 UIView 必须包含其他 UIView,但它的文档向您保证它会。

在 Swift 1.2 之前,没有 as!as 包括可能崩溃的情况和不会崩溃的情况。 new 运算符要求您清楚自己正在做的事情 总是成功,您 期望 总是成功,以及您计划测试失败。