簡體   English   中英

無需指定泛型類型的快速轉換

[英]Swift cast without specifying generic type

我正在嘗試為我的應用程序創建一個通用錯誤處理程序,並使事情變得更加復雜,我正在使用事件總線來傳遞任務,因此無法在編譯時指定類型。 我正在嘗試執行以下操作:

let apiTask = data.object as! Task // Option 1
let apiTask = data.object as! Task<AnyObject> // Option 2

apiTask!.continueWith { (task) in
    if(task.cancelled || task.faulted) {
        self.isInError = true
    } else {
        self.isInError = false
    }
}

選項1給出了編譯時錯誤,表明無法推斷Task的通用類型TResut。 選項2導致運行時錯誤,指出Task<SpecificType> cannot be caster to Task<AnyObject>

我在Java中有相同的實現,看來您不需要在那里指定通用類型。 Task<TResult>可能是任何類型,因此我無法在上述方法中指定它。 有什么辦法可以解決此問題?

聽起來您實際上並不需要泛型。 存在通用類型以在編譯時指定您要擦除的類型信息的確切類型。 如果您幾乎總是想忽略泛型參數,則應制作一個非泛型類型。 但是,如果您通常使用該信息,則仍然可以在某些方法中忽略它:無論如何,您只需要使這些方法通用即可:

func doSomething<T>(to: Task<T>) {
    //Do whatever you want that doesn't involve `T`.
    //You still have to make this method generic so it accepts any type of `Task`.
}

您是否考慮過將Task設為協議(或符合協議)?

protocol Task {
    func execute()
}

class SimpleTask<T>: Task {
    let parameter: T
    init(parameter: T) {
        self.parameter = parameter
    }
    func execute() {
        print("executing task with parameter: \(parameter)")
    }
}

func executeTask(task: Task) {
    task.execute()
}

let simpleTask = SimpleTask<Int>(parameter: 1)
executeTask(simpleTask)

我在Bolts-Swift問題跟蹤器上看到了您的帖子,並且由於我不知道您是否在那看到了我的答案,因此我想也將其發布在這里。 我是Bolts的新手,也是Swift的初學者,但是我有幾年的程序員經驗,因此這是我可能想到的解決方案:

我認為您可以創建一個類或結構作為實際結果的包裝。 此結構/類僅需要一個AnyObject類型的變量。 然后,將其用作任務的常規類型。 稍后,您可以對結果的類型進行嚴格檢查,例如使用if let string = task.result?.result as? String{...} if let string = task.result?.result as? String{...} 請參閱下面的代碼以了解我的意思。

func printHelloWorld() {
    doSomething().continueWith() { task in
        print(task.result?.result)
    }
}

func doSomething() -> Task<MyResult> {
    let tcs = TaskCompletionSource<MyResult>()
    ...
    tcs.set(result: MyResult(result: "Hello World" as AnyObject))
    ...
    return tcs.task
}

struct MyResult {
    var result: AnyObject
}

如我所說,我是Bolts和Swift的初學者,可能有更好的解決方案。 如果您已經找到了更好的解決方案,則可以將其發布在此處,然后選擇它作為問題的答案。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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