2016-08-04 136 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的初学者,可能有更好的解决方案。如果你已经找到了更好的解决方案,也许你可以在这里发布,并选择它作为你的问题的答案。 :)