簡體   English   中英

在Swift中,返回相同類型函數的泛型函數給出了“無法顯式地專門化泛型函數”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM