非可选类型可以为零吗?
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 是合法的,但编译器假定它们永远不会相同并警告你。
在 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 是合法的,但编译器假定它们永远不会相同并警告你。