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是合法的,但是编译器认为它们永远不会相同,并警告您。

10-08 15:41