我遇到了编译器问题。它发生在我使用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
}
然后我收到以下错误无法明确专门化通用功能
答案 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)