Swift:无法覆盖框架中实现的静态方法

时间:2016-01-11 01:27:08

标签: swift

当我在框架中调用泛型函数(<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)

断点确认我从未在我的真实项目中输入我的专用解码。在操场上运行我的示例代码很可能会导致调用正确的方法,因此它仅用于说明目的。

我还没有找到静态成员的任何调度规则。有人会对这种行为有所了解吗?

1 个答案:

答案 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

最后请注意,这些扩展是“全局的”,所以如果将此代码放在“框架”或“我的代码”中,则无关紧要。