Ho scoperto che le chiusure Swift non mantengono le variabili catturate a differenza delle mie aspettative.La chiusura di Swift conserva le variabili acquisite?
class AAA {
}
var a1 = AAA() as AAA? // expects RC == 1
var a2 = {()->AAA? in return a1 } // expects RC == 2, retained by `Optional<AAA>`
a1 = nil // expects RC == 1
a2() // prints nil, ????
Sono molto confuso con questo, perché ho creduto alle variabili catturati verranno conservati per impostazione predefinita. Ma, se lo catturo esplicitamente usando la lista di cattura, viene conservato.
class AAA {
}
var a1 = AAA() as AAA?
var a2 = { [a1]()->AAA? in return a1 }
a1 = nil
a2() // prints {AAA}, alive as expected.
Ho riletto il manuale di Swift, ma non ho trovato la descrizione correlata. L'elenco di cattura viene utilizzato per impostare unowned
in modo esplicito e sono ancora confuso. Qual è il comportamento corretto e perché succede?
Non vero. Ad esempio, 'func test() {var x = 42; sia f = {println (x)}; x = 43; f()}; test() 'stampa' 43', il che significa che la chiusura cattura la variabile per riferimento, anche se fa riferimento alla variabile senza modificarla. – newacct
Grazie a @newacct. Anche se non dicendo esplicitamente quello che ho scritto, la documentazione mi ha fatto pensare che funzionasse in quel modo. – Antonio
C'è un modo per forzare il compilatore a catturare per riferimento? Ho un caso in cui ho due chiusure ciascuna cercando di accedere a un valore condiviso. Una chiusura modifica il valore catturato e l'altro la legge solo. Tuttavia, quello che lo legge sta ricevendo una copia. Devo forzarlo a catturare per riferimento. –