非可选类型可以为零吗?

Can a non-optional type be nil?

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 的非可选怎么可能实际上是 nil。

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

我还没试过比较一个非可选的和 nil 是否合法;如果合法,则允许编译器假定比较总是 return "false";因此,检查一个不应该被允许为 nil 的非可选项实际上是否为 nil 是行不通的。

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