Ho trovato un'eccezione in cui mi piace molto una variabile solo setter, ovvero quando sto passando una chiusura come unico parametro in un metho d al solo scopo di salvarlo per un'esecuzione successiva.
implemento come un metodo come segue:
typealias ThemeSetter =() ->()
class Theme {
fileprivate var themeSetters:[ThemeSetter] = []
class var shared: Theme {
struct Singleton {
static let instance = Theme()
}
return Singleton.instance
}
...
func setColor(_ entry:@escaping ThemeSetter) {
entry()
themeSetters.append(entry)
}
}
posso quindi chiamare il metodo come segue:
Theme.shared.setColor({
self.navigationBar.barTintColor = Theme.shared.gameBarTint
})
Ma non mi piace chiudere paretheses dopo la parentesi chiusa, dal momento che Potrei avere molte linee nella chiusura.
Quindi, conoscendo Trailing Chiusure posso solo cambiare il codice di simile a questa:
Theme.shared.setColor() {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
Questo è perfettamente a posto ed è la sintassi che Apple mostra per Trailing Chiusure. Poiché non v'è solo l'un parametro e di essere il minimalista che io sono tentato di rendere il codice ancora più snella e ridurlo a questo:
Theme.shared.setColor {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
che è di nuovo come Apple dimostra di fare Trailing Chiusure; Tranne che, in questo modo viene solitamente utilizzato per una sorta di Predicato in cui la chiusura viene utilizzata per indicare al metodo come eseguire un ordinamento o quando la chiusura viene utilizzata alla fine di una chiamata di funzione asincrona come chiusura di completamento. Quello che voglio è assegnare la chiusura a ... Qualcosa.
Se sostituisco il metodo per setColor con una variabile che assomiglia a questo:
var setColor:ThemeSetter? {
didSet {
if setColor != nil {
setColor?()
themeSetters.append(setColor!)
setColor = nil
}
}
}
Ora la chiamata si presenta così:
Theme.shared.setColor = {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
che equivale a segno significa che la differenza di essere. Mostra che sto assegnando una chiusura e non eseguo alcuna funzione che utilizza la chiusura, anche se lo fa. : ') < - bisogno di emoticon qui.
Note finali: Questo in realtà non ha nulla a che fare con le chiusure, mostra solo come è possibile impostare un setter solo variabile, tranne che restituisce comunque un valore nullo. Non è inteso per proteggere la classe dall'avere l'utente che accede alla variabile per leggere come sarebbe un vero setter. Inoltre, perdona il tutorial su Trailing Closures and Singletons.
Potrei non ottenere abbastanza voti in modo che sia la risposta corretta, ma perché la risposta corretta è "No, non puoi! È necessario utilizzare una chiamata al metodo!". Dico "Ni" a chi ha bisogno di tutta quella sintassi. Basta usare una variabile e non leggerla di nuovo o se lo fai, non farlo restituire nulla. un po 'come la risposta di Rudolf Adamkovic, che ha ottenuto 0 voti.
No - suona come voi sarebbe meglio con un metodo. –
Hmm Suppongo che questa sia l'UNICA cosa che odierò di veloce allora! – Aggressor
Quando si utilizzano le proprietà di sola scrittura? Non ho mai avuto occasione di farlo. –