2

アプリケーション用のユニバーサル エラー ハンドラを作成しようとしていますが、問題をさらに複雑にしています。イベント バスを使用してタスクを渡しているため、コンパイル時に型を指定できません。私は次のことをしようとしています:

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>任意のタイプになる可能性があるため、上記のメソッドで指定することはできません。これを回避する方法はありますか?

4

3 に答える 3

3

実際にはジェネリック型が必要ないようです。ジェネリック型は、コンパイル時に、消去しようとしている型情報の種類を正確に指定するために存在します。ほとんどの場合、ジェネリック パラメータを無視したい場合は、非ジェネリック型を作成する必要があります。ただし、通常その情報を使用する場合は、特定のメソッドでそれを無視することもできます: いずれにせよ、それらのメソッドをジェネリックにする必要があります:

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`.
}
于 2016-08-05T00:29:54.677 に答える