【发布时间】:2017-07-20 15:06:26
【问题描述】:
我需要一个函数来解决类中的不同依赖关系。 但是出现编译错误。 是否可以创建通用函数或 Swift 中有一些编译器约束?
import Foundation
protocol Client: class {
var description: String { get }
}
final class ImportantPerson : Client {
var description: String {
return "Important person"
}
}
protocol Order: class {
var description: String { get }
}
final class LastOrder : Order {
var description: String {
return "Last order"
}
}
final class A {
fileprivate func resolveDependency<T>() -> T {
return resolve() as T
}
private func resolve() -> Client {
return ImportantPerson()
}
private func resolve() -> Order {
return LastOrder()
}
}
let a = A()
let client: Client = a.resolveDependency()
let order: Order = a.resolveDependency()
print("Client: \(client.description)")
print("Order: \(order.description)")
编辑:这个问题不是关于 Swift 是否允许创建两个仅在返回类型上有所不同的函数。我知道这是可能的。我认为编译器中存在一些人为约束,但在允许从上下文推断所需类型的基本逻辑中却没有。
【问题讨论】:
-
@DávidPásztor:我看不出 Q&A 如何回答 this 问题。
-
为什么需要一个函数?它不能工作,因为
T可以是 any 类型。为什么不能直接调用a.resolve(),让编译器选择合适的重载函数? -
@MartinR,我不想修改 Order 和 Person 类,我需要编译器从上下文推断类型。此代码中除了 Client 和 Order 没有其他类型,为什么编译器不能为这两种情况创建两个不同的函数并使用它们?
-
您可以调用
let client: Client = a.resolve(),编译器确实从上下文中选择匹配函数。