这个函数接受一个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
}它很管用,但看上去没那么好。我可以更改函数以便在第一个示例中使用它吗?
发布于 2016-03-09 09:52:11
您可以将函数定义为本地函数并传递它。
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
})发布于 2016-03-09 09:56:49
我认为它应该像这样工作:
let f = future {
NSThread.sleepForTimeInterval(2)
return 10
}..。或者,如果这对于Swift来说太难理解,那么您可以指定如下的闭包参数:
let f = future { Void -> Int in
NSThread.sleepForTimeInterval(2)
return 10
}发布于 2016-03-09 09:52:31
您可以将函数包装在结构中,并按如下方式使用:
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
}https://stackoverflow.com/questions/35887778
复制相似问题