2016-10-11 8 views
2

In einem MessagesViewController, verwenden wir die überschriebenen Delegate-Methoden. Beim Senden einer Nachricht wird didStartSending wie erwartet aufgerufen. Die nicht-optionalen Parameter message ist aber gleich Null:Kann ein nicht-optionaler Typ Null sein?

override func didStartSending(_ message: MSMessage, conversation: MSConversation) { 
    if message != nil { 
     logInfo("didStartSending message: \(message) conversation: \(conversation)") 
    } else { 
     logInfo("didStartSending message: \("why nil") conversation: \(conversation)") 
    } 
} 

Log:

"didStartSending message: why nil conversation: <MSConversation: 0x17026ca00>" 

Debugging mit po:

(lldb) po message 
    <uninitialized> 

Auch wir erhalten die erwartete Warnung auf der if Linie:

Comparing non-optional value of type MSMessage to nil always returns true 

Das gleiche gilt für didCancelSending.

Wie kann ein nicht-optional, die per definitionem in meinem Verständnis nicht null sein kann, tatsächlich Null sein.

Antwort

1

Der Compiler wird versuchen, es unmöglich zu machen, dass ein nicht-optionaler Wert immer Null ist. Ich denke, Sie können den Compiler überwinden, indem Sie eine Objective-C-Funktion als nonnull deklarieren und dann nil zurückgeben. Wenn Sie das tun, sind alle Chancen aus. Alles kann passieren.

Ich habe nicht versucht, wenn ein nicht-optional mit Null vergleichen ist legal oder nicht; Wenn es zulässig ist, darf der Compiler annehmen, dass der Vergleich immer "falsch" zurückgibt; also prüfen, ob ein nicht-optionales, das nie nil sein darf, eigentlich nil ist oder nicht, wird nicht funktionieren.

Ich sehe, Sie haben es überprüft ... Also Vergleich nicht-optional und Null ist legal, aber der Compiler geht davon aus, dass sie nie gleich sein werden und warnt Sie.

+0

Also das ist ein Apple Bug, wie ich deine Antwort verstehe, oder? – shallowThought

Verwandte Themen