【发布时间】:2016-05-21 17:49:33
【问题描述】:
我正在 Swift 中试验泛型,并试图将其推向极限。
在我的应用程序中,我有一个非常简单的围绕 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
}
}
调用函数报错:
"Cannot explicitly specialize a generic function"
******更新******
根据下面的答案,删除典型的 泛型类型说明符并将预期类型添加到完成参数可以解决问题。只是一个简单的例子:
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 通常根据扫描参数推断类型。完成闭包似乎不能正确支持这一点。
标签: ios swift generics completionhandler type-alias