![](/img/trans.png)
[英]Generic parameter 'T' could not be inferred / Cannot explicitly specialize a generic function
[英]Swift - Cannot explicitly specialize a generic function
我遇到了編譯器問題。 當我使用 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
}
然后我收到以下錯誤無法明確專門化通用函數
給閉包一個明確的類型來修復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)
}
您嘗試特化泛型函數的方式稱為explicit specialization
這不是語法錯誤,而是語義錯誤。 在解析時,兩者之間沒有區別
let x = foo<Int>()
和
let arr = Array<Int>()
但是在當前版本的 Swift 語言 5.1 中這是不允許的,但在未來的版本中可以允許使用它。
今天,泛型函數的類型參數總是通過類型推斷來確定的。 例如,給定:
func foo<T>()
let x = foo() as Int
// or
let x: Int = foo()
或 T 由參數的類型確定。 在這種情況下,必須在方法簽名中引入一個額外的參數
func foo<T>(t: T)
let x = foo(Int.self)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.