在Swift中,返回相同类型函数的泛型函数给出了“无法显式地专门化泛型函数”

时间:2016-03-09 09:35:28

标签: swift generics

此函数采用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
}

它有效,但看起来不那么好。 我可以更改功能,以便我可以在第一个示例中使用它吗?

3 个答案:

答案 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
}