当前位置: 首页 > 面试题库 >

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

龙枫
2023-03-14
问题内容

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

func annotationButtonTUI(sender: UIButton!) { }

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

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


问题答案:

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

您会看到从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您的操作方法永远不能为零,则可以!取消参数类型。如果希望编译器确保始终测试该参数,请将更改!?



 类似资料:
  • 问题内容: 我对&符号的了解只是一点点的了解,但有时我会在变量名的前面看到它。将a 放在变量前面有什么作用? 问题答案: 用作使变量成为输入输出参数。实际上,输入输出表示通过参考传递值,而不是通过值传递值。而且,它不仅需要通过引用接受值,还需要通过引用传递值,所以用&传递值,而不是 如您所见,您可以在Swift的错误处理中使用它,您必须创建一个错误引用并将其传递给使用该函数的函数,如果发生错误,该

  • 问题内容: 我知道出于文档目的注释中的含义,但除此之外又意味着什么?(我通常只会在Google上搜索,但结果中会显示每个非字母符号) 问题答案: 该符号表示Java注释。Java注释的作用是,它为变量,方法,类,接口或其他语言元素添加了特殊的属性。(可以在声明注释时进行配置)。向某事物添加注释时,程序的其他部分可以检查某事物是否具有注释。然后,它可以使用此信息来完成所需的任何工作。 让我举几个例子

  • 问题内容: 我用Javassist创建了一个没有实际方法的构造函数 当我试图拿出这堂课的签名时 我懂了 我很困惑“ V”是什么意思?我期望任何一个公共Echo(); 或类似的东西 问题答案: JVM使用一种紧凑的方式来存储方法签名,其中的构造函数被认为是特例。 例如: 表示不带参数的方法 表示它什么也不返回 该计划的其他部分是: -字节 -字符 -双 -浮动 -整数 - 长 -短 -无效 -布尔值

  • 问题内容: Swift编程语言指南包含以下示例: 然后,在将公寓分配给该人时,他们使用感叹号“解开实例”: “取消实例包装”是什么意思?为什么有必要?它与仅执行以下操作有何不同: 我是Swift语言的新手。只是想降低基础知识。 更新: 我遗漏的一大难题(未在答案中直接说明-至少在撰写本文时没有)是在执行以下操作时: 正如我最初所认为的,这并不意味着“ 是类型,可能为零”。我只是误解了,它们是完全独

  • 问题内容: 这是什么? 这是不时出现的关于JavaScript语法的问题的集合。这也是社区Wiki, 因此邀请所有人参与维护此列表。 为什么是这样? 堆栈溢出不允许搜索特定字符。结果,在搜索运算符和其他语法标记时,不容易找到许多问题。这也使得关闭重复项变得更加困难。下面的列表可以帮助解决此问题。 主要思想是链接到Stack Overflow上的现有问题,因此我们更容易引用它们,而不是复制ECMAS

  • 问题内容: 我想知道限制的含义是什么? 问题答案: 这是C99中引入的内容,它使编译器知道传入的指针与参数中的任何其他指针都没有指向相同的位置。如果向编译器提供此提示,则它可以进行一些更积极的优化而不会破坏代码。 例如,考虑以下功能: 显然,它从指针中添加了两个数字。如果需要,我们可以像这样使用它: 显然,它将输出8; 它本身增加了4。但是,如果我们添加到像这样: 那么以前的命令现在无效;它作为两