2

在一个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.

在我的理解中,根据定义不能为 nil 的 non-optional 怎么可能实际上是 nil。

4

1 回答 1

1

编译器将努力使非可选值永远为零。我认为您可以通过将 Objective-C 函数声明为 nonnull 然后使其返回 nil 来绕过编译器。如果你这样做了,那么所有的可能性都没有了。任何事情都有可能发生。

我没有尝试过将非可选与 nil 进行比较是否合法;如果它是合法的,那么编译器可以假设比较总是返回“false”;所以检查一个永远不应该被允许为 nil 的非可选是否实际上是 nil 将不起作用。

我看到你检查了它......所以比较非可选和 nil 是合法的,但编译器假设它们永远不会相同并警告你。

于 2016-10-18T14:14:24.947 回答