2015-09-19 12 views
5

Ich habe Optional Chaining Kapitel von Apples The Swift Programming Language (swift2) gelesen. In diesem Kapitel wird kein optionales Fragezeichen nach ein Funktionsname, aber vor der linken Klammer erwähnt.Optionales Verketten Fragezeichen nach Funktionsname

Aber ich sah den folgenden SWIFT-Code von this Apples Dokument (der ‚Delegation‘ Abschnitt):

//There is a question mark right after 'window' 
    if let fullScreenSize = myDelegate?.window?(myWindow, willUseFullScreenContentSize: mySize) { 
     print(NSStringFromSize(fullScreenSize)) 
    } 

Was bedeutet es ein Fragezeichen nach einem Funktionsnamen zu haben bedeutet aber vor der linken Klammer?

+0

Siehe mein Buch: http://www.apeth.com/swiftBook/ch04.html#SECoptionalProtocol und http://www.apeth.com/swiftBook/ch04.html#SECsuppressing – matt

Antwort

9

Es gibt zwei Situationen, in denen dies früher:

  • Ein Protokoll Methode selbst optional markiert, so dass wir nicht wissen, ob Der Adopter des Protokolls implementiert diese Methode.

  • Wir senden eine Nachricht an ein AnyObject. Wir können eine beliebige bekannte Klassennachricht an ein AnyObject senden - es verwirft die Typüberprüfung - aber dann wissen wir wiederum nicht, ob das tatsächliche Objekt diese Methode implementiert.

Also diese Fragezeichen bedeutet diese Nachrichtoptional und sicher zu senden. Wenn es sich herausstellt, dass der Empfänger nicht es implementiert, senden Sie die Nachricht nicht und geben Sie NULL zurück. Wenn der Empfänger implementiert es implementieren, senden Sie die Nachricht, aber jetzt müssen wir jedes Ergebnis in ein Optional (andernfalls können wir nil im ersten Fall nicht zurückgeben).

Hinter den Kulissen wird Objective-C respondsToSelector: aufgerufen. Daher ist dieses Muster nur verfügbar, wenn der Empfänger Objective-C ausgesetzt ist. Im Grunde ist dies ein Ziel-C-Sprachmerkmal, das in Swift-Kurzschrift ausgedrückt wird.

0

Dies wird verwendet, wenn eine Protokollmethode optional ist und möglicherweise nicht für das Objekt implementiert ist. (In diesem Fall ist die optionale window:willUseFullScreenContentSize: Methode aus dem NSWindowDelegate Protokoll)