此函数采用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
}
它有效,但看起来不那么好。 我可以更改功能,以便我可以在第一个示例中使用它吗?
答案 0 :(得分:2)
您可以将函数定义为本地函数并传递它。
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
})
答案 1 :(得分:1)
我认为它应该像这样工作:
let f = future {
NSThread.sleepForTimeInterval(2)
return 10
}
...或者如果Swift太难理解,那么你可以像这样指定闭包参数:
let f = future { Void -> Int in
NSThread.sleepForTimeInterval(2)
return 10
}
答案 2 :(得分:0)
您可以将函数包装在结构中并像这样使用它:
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
}