2016-10-11 4 views
2

MessagesViewController,에서 우리는 재정의 된 대리자 메서드를 사용하고 있습니다. 메시지를 보낼 때 didStartSending이 예상대로 호출됩니다. 비 선택적 매개 변수 message하지만 무기 호입니다 :비 선택적 유형을 없어도 될 수 있습니까?

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 함수를 nonnull로 선언하고 nil을 반환함으로써 컴파일러를 넘을 수 있다고 생각합니다. 그렇게하면 모든 확률은 사라집니다. 아무거나 일어날 수있다.

nil이 아닌 non-optional을 합법적으로 비교하는 경우 시도하지 않았습니다. 합법적 인 경우 컴파일러는 비교가 항상 "false"를 반환한다고 가정 할 수 있습니다. 따라서 nil이 될 수없는 선택이 아닌 것은 실제로는 nil인지 또는 작동하지 않는지 검사합니다.

나는 당신이 그것을 보았 음을 안다. 그래서 non-optional과 nil을 비교하는 것은 합당한 일이지만, 컴파일러는 그들이 결코 같지 않고 경고한다고 가정한다.

+0

이것은 Apple 버그입니다. 귀하의 답변을 어떻게 이해하고 있습니까? – shallowThought