2016-10-11 1 views
2

MessagesViewController,では、オーバーライドされたデリゲートメソッドを使用しています。メッセージを送信するときは、didStartSendingが期待通りに呼び出されます。非オプションのパラメータmessageしかしnilである:非オプション型を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>" 

経口によるデバッグ:

(lldb) po message 
    <uninitialized> 

また、我々はifライン上で予想される警告を取得

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

didCancelSendingについても同様です。

どのように非オプションでも、私の理解で定義することはできませんが、実際にはゼロにすることはできません。

答えて

1

コンパイラは、オプションではない値が常にnilになることを不可能にしようとします。 Objective-C関数を非NULLとして宣言して、それがnilを返さないようにすれば、コンパイラを越えることができると思います。もしそうすれば、すべてのオッズはオフになります。何でも起れる。

非オプションのnilとの比較が合法であるかどうかは試していません。合法であれば、コンパイラは比較が常に "false"を返すと仮定することができます。実際にはnilにならないようにするべきでない非オプションのものが実際にはnilであるかどうかをチェックすることは動作しません。

私はあなたがそれをチェックしたのを見ました...したがって、非オプションとnilを比較することは合法ですが、コンパイラは決して同じではないと警告し、あなたに警告します。

+0

これはアップルのバグです。あなたの答えをどうやって理解するのでしょうか? – shallowThought

関連する問題