首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中,返回相同类型函数的泛型函数给我“不能显式地专门化泛型函数”。

在Swift中,返回相同类型函数的泛型函数给我“不能显式地专门化泛型函数”。
EN

Stack Overflow用户
提问于 2016-03-09 09:35:28
回答 3查看 389关注 0票数 3

这个函数接受一个Void -> T函数并返回一个Void -> T函数。

代码语言:javascript
运行
复制
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!
    }
}

如果我像这样用它:

代码语言:javascript
运行
复制
let f = future<Int> {
    NSThread.sleepForTimeInterval(2)
    return 10
}

我得到的错误“不能显式地专门化一个泛型函数”。

但是,如果我将显式类型设置为Void -> Int,如下所示:

代码语言:javascript
运行
复制
let f: Void -> Int = future {
    NSThread.sleepForTimeInterval(2)
    return 10
}

它很管用,但看上去没那么好。我可以更改函数以便在第一个示例中使用它吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-09 09:52:11

您可以将函数定义为本地函数并传递它。

代码语言:javascript
运行
复制
func sleepAndReturn() -> Int { 
    NSThread.sleepForTimeInterval(2)
    return 10
}

let f = future(sleepAndReturn)

或者,您可以使用in语法来指定类型。

代码语言:javascript
运行
复制
let f = future({ () -> Int in  
    NSThread.sleepForTimeInterval(2)
    return 10
})

或更短:

代码语言:javascript
运行
复制
let f = future({ _ -> Int in  
    NSThread.sleepForTimeInterval(2)
    return 10
})
票数 2
EN

Stack Overflow用户

发布于 2016-03-09 09:56:49

我认为它应该像这样工作:

代码语言:javascript
运行
复制
let f = future {
    NSThread.sleepForTimeInterval(2)
    return 10
}

..。或者,如果这对于Swift来说太难理解,那么您可以指定如下的闭包参数:

代码语言:javascript
运行
复制
let f = future { Void -> Int in
    NSThread.sleepForTimeInterval(2)
    return 10
}
票数 1
EN

Stack Overflow用户

发布于 2016-03-09 09:52:31

您可以将函数包装在结构中,并按如下方式使用:

代码语言:javascript
运行
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35887778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档