Swift - 无法明确地专门化泛型函数

时间:2015-04-18 16:41:23

标签: xcode swift generics

我遇到了编译器问题。它发生在我使用SwiftTask和Async时,这是一个示例:

// - 通用方法

import Async
import SwiftTask

class AsyncTask {
    func background<T>(job: (((Float -> Void), (T -> Void), (NSError -> Void), SwiftTask.TaskConfiguration) -> Void)) -> SwiftTask.Task<Float, T, NSError> {
        return SwiftTask.Task<Float, T, NSError> { (progress: (Float -> Void), fulfill: (T -> Void), reject: (NSError -> Void), configure: SwiftTask.TaskConfiguration) -> Void in
            Async.background {
                job(progress, fulfill, reject, configure)
                return
            }

            return
        }
    }
}

现在编译,但是当我尝试使用这样的通用时:

// - 使用通用方法

let task = AsyncTask.background<MyAwesomeObject> { progress, fulfill, reject, configure in
    let obj = MyAwesomeObject()
    //-- ... do work here
    fulfill(obj)
    return
}

然后我收到以下错误无法明确专门化通用功能

2 个答案:

答案 0 :(得分:2)

为闭包提供一个显式类型来修复T

let task = AsyncTask.background{ (progress: Float -> Void, fulfill: MyAwesomeObject -> Void, reject: NSError -> Void, configure: SwiftTask.TaskConfiguration) -> Void in
    let obj = MyAwesomeObject()
    //-- ... do work here
    fulfill(obj)
}

答案 1 :(得分:0)

您尝试专用化泛型函数的方式称为explicit specialization。这不是语法错误,而是语义错误。在解析时,两者之间没有区别

let x = foo<Int>()

let arr = Array<Int>()

但是在当前的Swift语言版本5.1中,这是不允许的,但in future versions it could be permited可以使用它。

如今,泛型函数的类型参数总是通过类型推断来确定的。例如,给定:

func foo<T>()

let x = foo() as Int

// or

let x: Int = foo()

或T是通过参数的类型确定的。在这种情况下,必须在方法签名中引入一个额外的参数

func foo<T>(t: T)

let x = foo(Int.self)