Sto cercando di creare alcune definizioni di chiusura che userò molto nella mia app iOS. Così ho pensato di utilizzare un typealias come sembrava il più promettente ...Swift: riutilizzo di una definizione di chiusura (con typealias)
ho fatto un piccolo esempio giochi che mostra il mio problema in dettaglio
// Here are two tries for the Closure I need
typealias AnonymousCheck = (Int) -> Bool
typealias NamedCheck = (number: Int) -> Bool
// This works fine
var var1: AnonymousCheck = {
return $0 > 0
}
var1(-2)
var1(3343)
// This works fine
var var2: NamedCheck = {
return $0 > 0
}
var2(number: -2)
var2(number: 12)
// But I want to use the typealias mainly as function parameter!
// So:
// Use typealias as function parameter
func NamedFunction(closure: NamedCheck) {
closure(number: 3)
}
func AnonymousFunction(closure: AnonymousCheck) {
closure(3)
}
// This works as well
// But why write again the typealias declaration?
AnonymousFunction({(another: Int) -> Bool in return another < 0})
NamedFunction({(another: Int) -> Bool in return another < 0})
// This is what I want... which doesn't work
// ERROR: Use of unresolved identifier 'number'
NamedFunction({NamedCheck in return number < 0})
// Not even these work
// ERROR for both: Anonymous closure arguments cannot be used inside a closure that has exlicit arguments
NamedFunction({NamedCheck in return $0 < 0})
AnonymousFunction({AnonymousCheck in return $0 < 0})
Mi manca qualcosa o non è solo supportato in Swift? Grazie
EDIT/aggiunta:
Quanto sopra è solo un esempio semplice. Nella vita reale le mie tipicità sono più complicate. Qualcosa di simile:
typealias RealLifeClosure = (number: Int, factor: NSDecimalNumber!, key: String, upperCase: Bool) -> NSAttributedString
Io fondamentalmente voglio usare un typealias come una scorciatoia in modo da non dover digitare più di tanto. Forse le tipealie non sono la scelta giusta ... ce n'è un'altra?
Sì OK, sto dichiarando i parametri e il tipo di reso. Ma sarebbe bello se potessi usare il tipo di alias che ho già definito per farlo. Ecco cosa sono fondamentalmente dopo ... – Soko
Pensa al tuo tipo di alias come un * tipo * - non può diventare i parametri effettivi che sono mirati a quella chiusura, definisce solo quello che sono. È la differenza tra 'number' e' Int' in 'let numero: Int = 3'. –
OK ... ho capito cosa intendi. Dai un'occhiata però alla mia modifica della domanda. Pensavo solo di poter usare le tipografie per risparmiarmi a digitare continuamente chiusure complesse. Ma sembra che non posso farlo. – Soko