当我在框架中调用泛型函数(<T : Decodable>
)时,框架在类型上查找静态方法(T.decode()
) - 并始终将其解析为框架&#39; s该方法的默认实现。我提供了自己的相同方法的实现,但框架忽略了它。这是一个问题,因为该方法旨在被覆盖。
简化,看起来像这样:
public protocol Decodable {
static func decode()
}
// (parameter required in example to make it generic)
public func letsGo<T: Decodable>(_: T) {
T.decode() // this always calls Castable.decode()
}
// some default implementations:
public protocol Castable : Decodable {}
extension Castable {
static func decode() {
print("a default decode implementation for some standard types")
}
}
extension Bool : Castable {}
// ...etc.
我覆盖(?)解码Bool
:
// I import the framework
extension Bool {
static func decode() {
print("my specialized decode for Bool")
}
}
let myBool: Bool = true
letsGo(myBool)
断点确认我从未在我的真实项目中输入我的专用解码。在操场上运行我的示例代码很可能会导致调用正确的方法,因此它仅用于说明目的。
我还没有找到静态成员的任何调度规则。有人会对这种行为有所了解吗?
答案 0 :(得分:0)
如果你想要一个约束到letsGo(...)
的泛型类型(Decodable
)来访问---如果泛型是boolean --- blueprinted decode()
函数,那么您应该Bool
符合Decodable
而不是Castable
。{/ p>
此外,除非您有某些特定原因,否则decode()
的默认实施可能会放在Decodable
的扩展名中;因为decode()
是一个与Decodable
自然相关的函数,其意义强于Castable
。除此之外,您还可以添加Castable
的特定decode()
- 默认实现。
现在,除了Bool
之外,您当然可以自由地Castable
扩展Decodable
,如果您想要Bool
,请确保包括后者decode()
} - extension Bool : Decodable, Castable {
static func decode() {
print("my specialized decode for Bool")
}
}
的特定非默认版本。 E.g:
ValidateInteger
最后请注意,这些扩展是“全局的”,所以如果将此代码放在“框架”或“我的代码”中,则无关紧要。