一尘不染

在Swift中,!是什么?符号是功能签名中的意思?

swift

在Swift函数签名中,!参数after意味着什么?更具体地说,这是否意味着需要在传递参数之前将其解开,或者在传递参数时(自动)将其解开。这是一个示例:

func annotationButtonTUI(sender: UIButton!) { }

在这种情况下,该函数是UIButton的目标,因此无论发生什么情况,!它都会自动发生。

我的想法是,这意味着您可以期待一个未包装的sender对象,因此您无需尝试对其进行包装。


阅读 263

收藏
2020-07-07

共1个答案

一尘不染

这不是完全重复的- 函数签名中 隐式展开的可选 变量 有一些细微之处,超出了其他地方的用法。

您会看到从ObjC导入的API中隐式解开的可选参数,因为这是预期存在的对象的最接近Swift的近似值,但可以为nil。对于导入的API来说,这是一个折衷方案-
您可以像在ObjC中一样直接处理这些变量,并可以使用Swift可选语法对它们进行零测试。(在WWDC14 的Advanced
Interoperability演讲中
,有更多关于Apple的原理的信息。)该模式也适用于IBActionInterface
Builder插入的声明,因为这些方法实际上也是从ObjC代码中调用的。

正如您似乎怀疑的那样,从ObjC桥接时,Swift将可能的nil包裹在一个可选变量中,但是!函数实现的声明中的in会取消包装该值,因此您可以直接使用它。(风险自负。)

从Swift 1.2(2015年春季的Xcode 6.2)开始,可以用nonnull和标记ObjC API
nullable,在这种情况下,这些API的Swift接口使用非可选类型或完全可选类型。(而且自Swift 2.0 / Xcode
7.0起,几乎所有Apple的API都经过审核以使用可空性注释,因此它们的Swift签名不再使用!。)

对此鲜为人知的是,在实现自己的由ObjC调用的Swift函数时,您可以自由更改参数的可选性。如果希望编译器强制sender您的操作方法永远不能为零,则可以!取消参数类型。如果希望编译器确保始终测试该参数,请将更改!?

2020-07-07