我已阅读了苹果的Swift编程语言(swift2)的Optional Chaining章节。在本章中,没有提及可选的问号在之后的函数名称但在左括号之前。
但是我在this Apple的文档('代表团'部分)中看到了以下快速代码:
//There is a question mark right after 'window'
if let fullScreenSize = myDelegate?.window?(myWindow, willUseFullScreenContentSize: mySize) {
print(NSStringFromSize(fullScreenSize))
}
在函数名之后但在左括号之前有问号是什么意思?
答案 0 :(得分:10)
它使用了两种情况:
协议方法本身标记为optional
,因此我们不知道协议的采用者是否实现了此方法。
我们正在向AnyObject发送消息。我们可以将任何已知类消息发送给AnyObject - 它会抛弃类型检查 - 但是,我们再也不知道实际对象是否实现了这种方法。
< / LI>因此,此问号表示发送此消息可选和安全。如果结果是收件人不实现它,请不要发送邮件,并返回nil。如果收件人 实现它,请发送消息,但现在我们必须将任何结果包装在Optional中(因为否则我们在第一种情况下无法返回nil
)。
在幕后,正在调用Objective-C respondsToSelector:
。因此,仅当收件人暴露于Objective-C时,此模式才可用。基本上,这是一个用Swift简写表示的Objective-C语言特性。
答案 1 :(得分:0)
当协议方法是可选的并且可能未在对象上实现时使用。 (在本例中,window:willUseFullScreenContentSize:
协议中的可选NSWindowDelegate
方法)