非可选类型可以为零吗?

时间:2016-10-11 18:04:22

标签: ios swift3 imessage-extension

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也是如此。

在我的理解中,根据定义不能为零的非可选项实际上如何为零。

1 个答案:

答案 0 :(得分:1)

编译器会尽力使非可选值永远不可能。我认为你可以通过将Objective-C函数声明为nonnull然后使其返回nil而超越编译器。如果你这样做,那么所有的赔率都是关闭的。任何事情都可能发生。

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

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