私はSwiftでジェネリックスを実験していますが、私はそれを限界まで押し込もうとしています。Swiftジェネリックを使用して完了ブロックを使用したAPIリクエストを書く
私のアプリケーションでは、Alamofireの周りには単純なAPIラッパーがあります。構造はそうのようなものです:ここでは
API -> Request -> Alamofire request
は、私はいくつかの概念をテストするために運動場に投げたいくつかの一般的なコードです。ここで私はこれまで持っているものである:関数を呼び出す
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
}
}
はエラーを与える:答えは1として
"Cannot explicitly specialize a generic function"
****** ****** UPDATE
典型的な<>ジェネリック型指定子を削除し、期待される型を補完パラメータに追加することで問題が解決されます。ただ、簡単な例:
func test() {
API.performRequest { (item: Something?, error) in
}
}
また、私はAPIのラッパークラスを作成することは、一般的なクラスはそうのような問題を解決することを発見した:
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
}
}
いずれかの方法で、最終目標が達成されます。私たちは、一連のタスクを実行し、それぞれの用途で渡された型に基づいてオブジェクトを完了クロージャで返す単一の汎用メソッドを持っています。
私は、コンパイラが関数に適用する型を知らないと思います。クロージャでパラメータタイプを指定してみてください。 –
ジェネリック薬を使用する目的を破ることはできませんか?私が理解しているところから、iOSは通常、スキャニングパラメータに基づいてタイプを推定します。完了クロージャはこれを適切にサポートしていないようです。 –