2016-10-11 1 views
2

Dans un MessagesViewController,, nous utilisons les méthodes déléguées substituées. Lors de l'envoi d'un message, didStartSending est appelé comme prévu. Le paramètre non optionnel message est nul si:Un type non facultatif peut-il être nul?

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 avec po:

(lldb) po message 
    <uninitialized> 

Nous obtenons également l'avertissement prévu sur la ligne if:

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

La même chose est vraie pour didCancelSending.

Comment un élément non facultatif, qui ne peut pas être nul par définition à ma connaissance, est-il réellement nul?

Répondre

1

Le compilateur tentera difficilement de rendre impossible qu'une valeur non optionnelle soit nulle. Je pense que vous pouvez passer devant le compilateur en déclarant une fonction Objective-C comme non-nulle et en la faisant revenir à zéro. Si vous faites cela, alors toutes les chances sont désactivées. Tout peut arriver.

Je n'ai pas essayé si comparer un non-optionnel avec nil est légal ou non; si c'est légal alors le compilateur est autorisé à supposer que la comparaison retournera toujours "faux"; donc vérifier qu'un non-optionnel qui ne devrait jamais être autorisé à être nul est en fait nul ou ne fonctionnera pas.

Je vois que vous l'avez coché ... Donc, comparer non-optionnel et nil est légal, mais le compilateur suppose qu'il ne sera plus jamais le même et vous avertira.

+0

Donc, c'est un bug d'Apple, comment je comprends votre réponse, non? – shallowThought