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 运算符要求您清楚自己正在做的事情 将 总是成功,您 期望 总是成功,以及您计划测试失败。
我不太明白 as!
运算符应该添加什么新功能。
Apple's documentation 说:
The
as!
operator performs a forced cast of the expression to the specified type. Theas!
operator returns a value of the specified type, not an optional type. If the cast fails, a runtime error is raised. The behavior ofx 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 运算符要求您清楚自己正在做的事情 将 总是成功,您 期望 总是成功,以及您计划测试失败。