没有指定泛型类型的Swift类型转换
我正在尝试为我的应用程序创建一个通用错误处理程序,并使事情变得更加复杂我正在使用事件总线来传递任务,因此我无法指定类型编译时间。我试图做到以下几点:没有指定泛型类型的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>
可能是任何类型,所以我不能在上面的方法中指定它。有什么办法可以解决这个问题吗?
这听起来像你实际上并不想要一个泛型类型。泛型类型的存在是为了在编译时指定正在尝试删除的类型信息。如果你几乎总是想忽略泛型参数,那么你应该创建一个非泛型类型。但是,如果您通常使用该信息,你仍然可以忽略它在某些方法:你只需要做出这些方法一般反正:
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`.
}
你有没有考虑做任务的协议(或符合一协议)?
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的初学者,但作为程序员我有几年的经验,所以这是一个可能的解决方案,我想出了:
我认为你可以创建一个类或结构作为包装到您的实际结果。这个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的初学者,可能有更好的解决方案。如果你已经找到了更好的解决方案,也许你可以在这里发布,并选择它作为你的问题的答案。 :)
不幸的是我不能这样做,因为'任务'存储在'data.object'中。现在这不是一件真正安全的事情,但我愿意冒这个风险,并尝试将其转换为“任务”。不幸的是,似乎斯威夫特是不允许的 –
因此,选项1(改为非泛型)已经结束。选项2是!如上所示,使您的通用错误处理程序方法具有通用性。 – andyvn22