【发布时间】:2021-11-11 18:23:31
【问题描述】:
[更新了一个不那么做作的例子]
我正在尝试扩展一个通用函数来为特定类型提供不同的行为。当我直接调用该函数时,这按预期工作。但是如果我从另一个泛型函数中调用它,则不会保留原始泛型类型并且我会得到默认行为。我对 Swift 有点陌生,所以我可能在这里遗漏了一些明显的东西。
我的代码如下所示:
protocol Task {
associatedtype Result
}
struct SpecificTask: Task {
typealias Result = String
// other taks related properties
}
enum TaskRunner<T: Task> {
static func run(task: T) throws -> T.Result {
// Task not supported
throw SomeError.error
}
}
extension TaskRunner where T == SpecificTask {
static func run(task: T) throws -> T.Result {
// execute a SpecificTask
return "Some Result"
}
}
func run<T: Task>(task: T) throws -> T.Result {
// Additional logic related to running the task
return try TaskRunner.run(task: task)
}
print(try TaskRunner.run(task: SpecificTask())) // Prints "Some Result"
print(try run(task: SpecificTask())) // Throws SomeError
我需要顶层run函数调用底层run()函数的SpecificTask版本,但是调用的是泛型版本的函数
【问题讨论】:
-
我建议你做一个不那么做作的例子,这样你的实际问题就可以得到解决(除非你只是想了解这背后的原因)。
-
谢谢!我用一个不那么做作的例子更新了我的帖子。