在MessagesViewController,
中,我们使用重写的委托方法。发送邮件时,会按预期调用didStartSending
。非可选参数message
为零:
override func didStartSending(_ message: MSMessage, conversation: MSConversation) {
if message != nil {
logInfo("didStartSending message: \(message) conversation: \(conversation)")
} else {
logInfo("didStartSending message: \("why nil") conversation: \(conversation)")
}
}
日志:
"didStartSending message: why nil conversation: <MSConversation: 0x17026ca00>"
使用po进行调试:
(lldb) po message
<uninitialized>
我们也会在if
行收到预期的警告:
Comparing non-optional value of type MSMessage to nil always returns true
didCancelSending
也是如此。
在我的理解中,根据定义不能为零的非可选项实际上如何为零。
答案 0 :(得分:1)
编译器会尽力使非可选值永远不可能。我认为你可以通过将Objective-C函数声明为nonnull然后使其返回nil而超越编译器。如果你这样做,那么所有的赔率都是关闭的。任何事情都可能发生。
如果将非可选项与nil进行比较是否合法,我没有尝试过;如果它是合法的,则允许编译器假定比较将始终返回“false”;因此,检查一个永远不应该被允许为nil的非可选项实际上是nil将不起作用。
我看到你检查过了......所以比较非可选和nil是合法的,但编译器假设它们永远不会相同并警告你。