2014-10-15 16 views
34

Nelle esercitazioni il suo scritto che funzionalmente sono entrambi uguali anche la chiusura è più semplice del blocco e ha evitato la complessità del blocco e della gestione della memoria, ne ho attraversati molti tutorial ma ad eccezione di questi non sto ottenendo la differenza tra "chiusura" di Swift e "blocco" Objective-C.Differenza tra blocco (obiettivo C) e chiusura (Swift) in ios

Qualcuno può spiegare questa differenza in profondità. Qualsiasi aiuto sarebbe apprezzato.

+0

Marcatura una risposta con un "segno di spunta" è previsto comportamento StackOverflow. Se la risposta fornita non soddisfa le tue esigenze, quindi fornire un commento alla risposta. – GoZoner

risposta

44

Estratto da: Apple Inc. “Utilizzando Swift con cacao e Objective-C.” IBook:

“chiusure Swift e Objective-C blocchi sono compatibili, in modo da poter passare chiusure Swift a Objective-C metodi che prevedono blocchi. Le chiusure e le funzioni Swift hanno lo stesso tipo, quindi puoi persino passare il nome di una funzione Swift.

Le chiusure hanno semantica di cattura simile a blocchi ma differiscono in un modo chiave: le variabili sono modificabili anziché copiate. In altre parole, il comportamento di __block in Objective-C è il comportamento predefinito per le variabili in Swift. "

+1

Grazie per la spiegazione. – Raja

1

Lievi differenze. Uno è stato menzionato; le variabili sono catturate come variabili, non come valori. Quale può essere utile o una trappola. È importante sottolineare che è possibile definire una lista di cattura in una chiusura rapida, quindi se si include self.property nell'elenco di cattura, il valore di tale proprietà viene catturato e non autonomo. Ciò semplifica anche la cattura di variabili deboli.

0

mostrare un esempio di codice reale delle differenze:

Ciò compilare:

let x : @convention(swift) (inout Int) ->() 

Questo non lo fa:

let y : @convention(block) (inout Int) ->() 

con l'errore (inout Int) ->() is not representable in Objective-C

+1

Non è possibile utilizzare inout perché la convenzione di chiamata Objective-C non ha riferimenti e la conversione tra un riferimento e un puntatore non è implicita. Tuttavia ha dei puntatori, quindi dovrai usare 'UnsafePointer '. Ciò rende le due firme una nella stessa. – Brandon

+0

@Brandon Come detto in precedenza, se sei così sicuro che blocchi e chiusure sono le stesse, scrivi agli sviluppatori di Swift che dovrebbero cambiare la documentazione della loro lingua perché ritieni che sia sbagliato;) – Kametrixom

+0

Dove ho detto che sono sbagliati? . – Brandon