![](/img/trans.png)
[英]Swift generics - Cannot explicitly specialize a generic function
[英]In Swift, a generic function that returns a function of the same type gives me “Cannot explicitly specialize a generic function”
此函數采用Void -> T
函數並返回Void -> T
函數。
func future<T>(f: Void -> T) -> Void -> T {
let queue = dispatch_queue_create("com.test.lockQueue", nil)
var results: T?
dispatch_async(queue) {
results = f()
}
return {
dispatch_sync(queue) {}
return results!
}
}
如果我像這樣使用它:
let f = future<Int> {
NSThread.sleepForTimeInterval(2)
return 10
}
我收到錯誤“無法明確專門化泛型函數”。
但是,如果我將顯式類型設置為Void -> Int
如下所示:
let f: Void -> Int = future {
NSThread.sleepForTimeInterval(2)
return 10
}
它有效,但看起來不那么好。 我可以更改功能,以便我可以在第一個示例中使用它嗎?
您可以將該函數定義為本地函數並將其傳遞。
func sleepAndReturn() -> Int {
NSThread.sleepForTimeInterval(2)
return 10
}
let f = future(sleepAndReturn)
或者,您可以使用in
語法指定類型。
let f = future({ () -> Int in
NSThread.sleepForTimeInterval(2)
return 10
})
或更短:
let f = future({ _ -> Int in
NSThread.sleepForTimeInterval(2)
return 10
})
我認為它應該像這樣工作:
let f = future {
NSThread.sleepForTimeInterval(2)
return 10
}
...或者如果Swift難以弄清楚,那么你可以像這樣指定閉包參數:
let f = future { Void -> Int in
NSThread.sleepForTimeInterval(2)
return 10
}
您可以將函數包裝在結構中並像這樣使用它:
struct Future<T> {
static func create(f: Void -> T) -> Void -> T {
let queue = dispatch_queue_create("com.test.lockQueue", nil)
var results: T?
dispatch_async(queue) {
results = f()
}
return {
dispatch_sync(queue) {}
return results!
}
}
}
let f = Future<Int>.create {
NSThread.sleepForTimeInterval(2)
return 20
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.