在Swift,什么!在函数签名中的符号含义?

在Swift函数签名中,什么是!后一个参数暗示?更具体地说,这是否意味着参数需要在传入之前被解开,或者它在传入时被自动解包。这里是一个例子:
func annotationButtonTUI(sender: UIButton!) { }

在这种情况下,函数是一个UIButton的目标,所以无论发生什么!正在自动发生。

我的想法是这意味着你可以期望一个未包装的发件人对象,所以你不需要尝试打开它。

这不是一个重复 – 有一些微妙的隐含的解开可选的函数签名超出了他们在别处的使用。

你看到在从ObjC导入的API中的隐式未包装可选属性,因为这是一个对象的最接近的Swift近似,该对象预期存在但可以是nil。这是一个妥协导入的API – 你可以直接解决这些变量像ObjC,你可以测试他们为nil使用Swift可选语法。 (关于Apple的理由,在Advanced Interoperability talk从WWDC14。)这种模式也适用于Interface Builder插入的IBAction声明,因为这些方法实际上也从ObjC代码调用。

因为你似乎怀疑,Swift包裹可能的nil在从ObjC桥接,但是!在你的函数实现的声明中解包的值,所以你可以直接使用它。 (自行承担风险。)

由于Swift 1.2(2015年春季的Xcode 6.2),ObjC API可以注释为非空和可空,在这种情况下,这些API的Swift接口使用非可选类型或完全可选类型。 (自从Swift 2.0 / Xcode 7.0以来,几乎所有的苹果的API都被审核使用可空性注释,所以他们的Swift签名不再使用了!)

不太了解的是,你可以随意改变参数的可选性,当你实现自己的Swift函数,由ObjC调用。如果你希望编译器强制该发送者在你的action方法永远不能为nil,你可以采取!关闭参数类型。如果你希望编译器确保你总是测试参数,改变!到a?。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...