2016-10-11 6 views
2

В 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>" 

Отладка с помощью ПО:

(lldb) po message 
    <uninitialized> 

Также мы получаем ожидаемое предупреждение о if линии:

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

То же самое верно для didCancelSending.

Как может не факультативный, который по определению не может быть по определению в моем понимании, фактически равен нулю.

ответ

1

Компилятор попытается изо всех сил сделать невозможным то, что значение необязательного значения всегда равно нулю. Я думаю, вы можете пройти мимо компилятора, объявив функцию Objective-C как ненулевую, а затем запустив ее. Если вы это сделаете, все шансы не будут. Все может случиться.

Я не пробовал, если сравнение без факультативного с nil является законным или нет; если это законно, то компилятору разрешено предположить, что сравнение всегда будет возвращать «false»; поэтому проверка того, что не факультативный, который никогда не должен быть нулевым, фактически равен нулю или не будет работать.

Я вижу, что вы его проверили ... Поэтому сравнение без факультативного и nil является законным, но компилятор предполагает, что они никогда не будут одинаковыми и предупреждают вас.

+0

Так что это ошибка Apple, как я понимаю ваш ответ, правильно? – shallowThought