2016-08-04 11 views
0

私はアプリケーションの汎用エラーハンドラを作成しようとしています。さらに複雑になりました。イベントバスを使ってタスクを渡していますので、タイプを指定できません。コンパイル時。 1タスクのジェネリック型TResutを言って、コンパイル時にエラーが推測できない与えジェネリック型を指定しないでスローキャスト

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 
    } 
} 

オプション:私は、次の操作を実行しようとしています。 オプション2は、私はあなたがそこにジェネリック型を指定する必要はありませんようで、Javaで同じ実装を持ってTask<SpecificType> cannot be caster to Task<AnyObject>

言って、ランタイムエラーが発生します。 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

残念ながら、 'Task'が' 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でも初心者ですが、私はプログラマーとして数年の経験がありますので、これは私が思いついた解決策です。

あなたはクラスあなたの実際の結果にラッパー。この構造体/クラスはAnyObject型の変数を1つだけ必要とします。次に、これを汎用タイプのタスクとして使用します。後で、結果のタイプを確認することができます。 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 and Swiftの初心者で、おそらくもっと良い解決策があります。すでに優れたソリューションが見つかった場合は、ここに投稿して質問の答えとして選択することができます。 :)

関連する問題