2015-09-19 17 views
5

Ho letto il capitolo Optional Chaining di Swift Programming Language (swift2) di apple. In questo capitolo non si fa menzione di un punto interrogativo opzionale dopo il un nome di funzione ma prima della parentesi sinistra.Punto interrogativo opzionale di concatenamento dopo il nome della funzione

Ma ho visto il seguente codice swift da this documento di Apple (la sezione 'delegazione'):

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

Che cosa significa di avere un punto interrogativo dopo il nome della funzione, ma prima della parentesi di sinistra?

+0

Vedere il mio libro: http://www.apeth.com/swiftBook/ch04.html#SECoptionalProtocol e http://www.apeth.com/swiftBook/ch04.html#SECsuppressing – matt

risposta

9

Ci sono due situazioni in cui questo è utilizzato:

  • Metodo protocollo è in sé segnata optional, quindi non sappiamo se l'adottante del protocollo implementa questo metodo.

  • Stiamo inviando un messaggio a un oggetto AnyObject. Possiamo inviare qualsiasi messaggio di classe noto a un oggetto AnyObject - elimina il controllo di tipo - ma, di nuovo, non sappiamo se l'oggetto reale implementa questo metodo.

Quindi questo punto di domanda significa per inviare questo messaggio opzionalmente e sicurezza. Se risulta che il destinatario fa non implementarlo, non inviare il messaggio e restituire nil. Se il destinatario lo implementa, invia il messaggio, ma ora dobbiamo avvolgere qualsiasi risultato in un Opzionale (perché altrimenti non potremmo restituire nil nel primo caso).

Dietro le quinte, viene chiamato Objective-C respondsToSelector:. Quindi, questo modello è disponibile solo se il destinatario è esposto a Objective-C. Fondamentalmente, questa è una caratteristica del linguaggio Objective-C espressa nella stenografia di Swift.

0

Viene utilizzato quando un metodo di protocollo è facoltativo e potrebbe non essere implementato sull'oggetto. (In questo caso, il metodo di window:willUseFullScreenContentSize: opzionale dal relativo protocollo NSWindowDelegate)

Problemi correlati