簡體   English   中英

Swift - 無法顯式專門化泛型函數

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

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