在MessagesViewController,
中,我们使用了重写的委托方法。发送消息时,按预期方式调用didStartSending
。但是,非可选参数message
为nil:
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
也是如此。在我的理解中,非可选(根据定义不能为零)如何实际上为零。
最佳答案
编译器将努力使非可选值永远为零。我认为您可以通过将Objective-C函数声明为nonnull然后使其返回nil来克服编译器的问题。如果这样做,那么所有的可能性都将消失。什么都可能发生。
我没有尝试过将非可选与nil进行比较是否合法;如果合法,则允许编译器假定比较将始终返回“false”;因此,检查不应不允许为零的非可选项实际上是否为nil无效。
我看到您检查了它...因此比较非可选和nil是合法的,但是编译器认为它们永远不会相同,并警告您。