nur eine Art von Typ die Funktion second
Arbeit für Sie ist gut genug, wenn mit, dann ist Matts Antwort gut.
class First<T, U> {
typealias ClosureType = (value: T) -> U
var savedClosure: ClosureType? = nil
func second(closure: ClosureType) {
savedClosure = closure
}
}
Das beantwortet Ihre Frage nicht wie angegeben!
Die Sache ist: Sie können einen Wert eines unbekannten Typs nicht speichern. Aber! Wenn der Typ einem bekannten Protokoll entspricht, können Sie ihn speichern.
protocol P {}
class First<T> {
typealias ClosureType = (value: T) -> P
var savedClosure: ClosureType? = nil
func second<U: P>(closure: (value: T) -> U) {
savedClosure = closure
}
}
Das Protokoll selbst protocol<>
„kein Protokoll an all“ sein könnte, die das Schlüsselwort Any
typealiased wird.
class First<T> {
typealias ClosureType = (value: T) -> Any
var savedClosure: ClosureType? = nil
func second<U>(closure: (value: T) -> U) {
savedClosure = closure
}
}
Aber wir wissen nicht wirklich, was Sie tun wollen, so gibt es mehrere Antworten auf Ihre Frage ... zum Beispiel, vielleicht wollten Sie für jeden Typ einen separaten Verschluss speichern?
class First<T> {
typealias ClosureType = (value: T) -> Any
var savedClosures = [String: ClosureType]()
func second<U>(closure: (value: T) -> U) {
savedClosures[String(U)] = closure
}
}
Wie dem auch sei, die eigentliche Frage ist: „Haben Sie das wirklich tun müssen, ist es eine einfache Änderung, die Sie tun können, vermeidet diese Notwendigkeit?“
Wahrscheinlich verwandt: http://stackoverflow.com/questions/25401584/generics-as-parameters-to-a-closure-in-swift –