2016-08-04 139 views
0

我正在嘗試爲我的應用程序創建一個通用錯誤處理程序,並使事情變得更加複雜我正在使用事件總線來傳遞任務,因此我無法指定類型編譯時間。我試圖做到以下幾點:沒有指定泛型類型的Swift類型轉換

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給出了一個編譯時錯誤說泛型類型任務的TResut無法推斷。 選項2導致運行時錯誤說Task<SpecificType> cannot be caster to Task<AnyObject>

我在Java中相同的實現它似乎你並不需要有指定泛型類型。 Task<TResult>可能是任何類型,所以我不能在上面的方法中指定它。有什麼辦法可以解決這個問題嗎?

回答

1

這聽起來像你實際上並不想要一個泛型類型。泛型類型的存在是爲了在編譯時指定正在嘗試刪除的類型信息。如果你幾乎總是想忽略泛型參數,那麼你應該創建一個非泛型類型。但是,如果您通常使用該信息,你仍然可以忽略它在某些方法:你只需要做出這些方法一般反正:

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`. 
} 
+0

不幸的是我不能這樣做,因爲'任務'存儲在'data.object'中。現在這不是一件真正安全的事情,但我願意冒這個風險,並嘗試將其轉換爲「任務」。不幸的是,似乎斯威夫特是不允許的 –

+1

因此,選項1(改爲非泛型)已經結束。選項2是!如上所示,使您的通用錯誤處理程序方法具有通用性。 – andyvn22

0

你有沒有考慮做任務的協議(或符合一協議)?

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) 
0

我看到你在螺栓上,斯威夫特問題跟蹤器後,因爲我,如果你看到我的回答有不知道,我想我在這裏發表它。我是Bolts新手,也是Swift的初學者,但作爲程序員我有幾年的經驗,所以這是一個可能的解決方案,我想出了:

我認爲你可以創建一個類或結構作爲包裝到您的實際結果。這個struct /類只需要一個AnyObject類型的變量。然後,您將其用作任務的通用類型。稍後,您可以對結果的類型e進行實際檢查。 G。通過使用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的初學者,可能有更好的解決方案。如果你已經找到了更好的解決方案,也許你可以在這裏發佈,並選擇它作爲你的問題的答案。 :)