Ich experimentiere mit Generika in Swift und versuche, sie an ihre Grenzen zu bringen.Schreiben von API-Anfragen mit Vervollständigungsblöcken unter Verwendung von Swift-Generika
In meiner Anwendung habe ich eine sehr einfache API-Wrapper um Alamofire. Die Struktur ist in etwa so:
API -> Request -> Alamofire request
Hier sind einige allgemeine Code, den ich in einen Spielplatz warf einige Konzepte zu testen. Hier ist, was ich bisher:
protocol SomeProtocol {
var cheese: String { get }
init()
}
class Something: SomeProtocol {
required init() { }
var cheese: String {
return "wiz"
}
}
class API {
class func performRequest<T: SomeProtocol>(completion: (T?, NSError) -> Void) {
// This code is irrelevant, just satisfying the completion param
let test = T()
let error = NSError(domain: "Pizza", code: 1, userInfo: nil)
completion(test, error)
}
}
func test() {
API.performRequest<Something> { item, error in
}
}
Aufruf der Funktion gibt den Fehler:
"Cannot explicitly specialize a generic function"
****** ****** UPDATE
Gemäß der Antwort Im Folgenden wird der typische <> generische Typspezifizierer entfernt und stattdessen der erwartete Typ zu den Abschlussparametern hinzugefügt, um das Problem zu lösen. Nur ein kleines Beispiel:
func test() {
API.performRequest { (item: Something?, error) in
}
}
Zusätzlich habe ich entdeckt, dass die API-Wrapper-Klasse eine generische Klasse zu machen, löst das Problem wie folgt:
protocol SomeProtocol {
var pizza: String { get }
}
class SomeObject: SomeProtocol {
var pizza: String { return "pie" }
}
class API<T: SomeProtocol> {
class func performRequest(completion: (T?, NSError?) -> Void) {
}
}
func test() {
API<SomeObject>.performRequest { item, error in
// Do something with item, which has a type of SomeObject
}
}
So oder so, das Endziel erreicht wird. Wir haben eine einzige generische Methode, die eine Reihe von Aufgaben ausführt und das Objekt basierend auf dem mit jeder Verwendung übergebenen Typ über die Abschlussschließung zurückgibt.
Ich glaube, der Compiler weiß nicht, welchen Typ auf die Funktion anzuwenden ist.Versuchen Sie, den Parametertyp in Ihren Schließungen anzugeben. –
Würde das nicht den Zweck der Verwendung von Generika besiegen? Soweit ich weiß, leitet iOS den Typ normalerweise basierend auf Scan-Parametern ein. Es scheint, dass Vollzugsabschlüsse dies nicht angemessen unterstützen. –