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

Swift:无法覆盖在框架中实现的静态方法,swift,Swift,当我在框架中调用泛型函数()时,框架会在类型上查找静态方法(T.decode()),并始终将其解析为该方法的框架默认实现。我提供了相同方法的自己的实现,但框架忽略了它。这是一个问题,因为该方法被设计为被重写 简而言之,它看起来是这样的: 来自框架的代码(单独的模块) 断点确认我从未在真实项目中输入专门的解码。在操场上运行我的示例代码很可能会导致调用正确的方法,所以这只是为了说明 我没有找到任何静态成员的分派规则。有人能解释一下这种行为吗?如果你想要一个泛型类型(在letsGo(…)中)被限制为可

当我在框架中调用泛型函数(
)时,框架会在类型上查找静态方法(
T.decode()
),并始终将其解析为该方法的框架默认实现。我提供了相同方法的自己的实现,但框架忽略了它。这是一个问题,因为该方法被设计为被重写

简而言之,它看起来是这样的:

来自框架的代码(单独的模块) 断点确认我从未在真实项目中输入专门的解码。在操场上运行我的示例代码很可能会导致调用正确的方法,所以这只是为了说明


我没有找到任何静态成员的分派规则。有人能解释一下这种行为吗?

如果你想要一个泛型类型(在
letsGo(…)
中)被限制为
可解码的
来访问---如果泛型是布尔型---蓝印的
decode()
函数,然后您应该通过符合
可解码的
而不是
可转换的
来扩展
Bool

另外,除非您有特定的原因,否则
decode()
的默认实现可能更倾向于放在
可解码的扩展中;因为
decode()
是一个与
Decodable
自然关联的函数,其意义比
Castable
强。当然,除此之外,您还可以为
decode()
添加一个特定的
Castable
——默认实现

现在,您当然可以自由地扩展
Bool
,除了
Decodable
之外,还可以遵循
Castable
,如果您想要
Bool
特定的非默认版本的
decode()
,请确保包含后者。例如:

extension Bool : Decodable, Castable {
     static func decode() {
        print("my specialized decode for Bool")
    }
}

最后请注意,这样的扩展是“全局的”,因此您是否将此代码放在“框架”或“我的代码”中并不重要。

如果您想要一个泛型类型(在
letsGo(…)
中)约束为
可解码的
来访问——如果泛型是布尔型的话——蓝印的
decode()
函数,然后您应该通过符合
可解码的
而不是
可转换的
来扩展
Bool

另外,除非您有特定的原因,否则
decode()
的默认实现可能更倾向于放在
可解码的扩展中;因为
decode()
是一个与
Decodable
自然关联的函数,其意义比
Castable
强。当然,除此之外,您还可以为
decode()
添加一个特定的
Castable
——默认实现

现在,您当然可以自由地扩展
Bool
,除了
Decodable
之外,还可以遵循
Castable
,如果您想要
Bool
特定的非默认版本的
decode()
,请确保包含后者。例如:

extension Bool : Decodable, Castable {
     static func decode() {
        print("my specialized decode for Bool")
    }
}

最后请注意,像这样的扩展是“全局的”,因此您是否将此代码放在“框架”或“我的代码”中并不重要。

尝试使
扩展Bool:Castable{}
直接(或也)符合
可解码的
而不是(除了)
可转换的
。也就是说,
extensionbool:Decodable{}
(或者
extensionbool:Castable,Decodable{}
)是的,这可能会奏效。我考虑过这样做,但决定不这样做,因为下一次我运行
pod update
时,我的更改将消失:)尝试使
扩展Bool:Castable{}
直接(或同时)符合
可解码
,而不是(除了)
Castable
。也就是说,
extensionbool:Decodable{}
(或者
extensionbool:Castable,Decodable{}
)是的,这可能会奏效。我考虑过这样做,但决定不这样做,因为下次我运行
pod update
时,我的更改将消失:)谢谢你的建议。尽管可能,但编辑框架代码并不可取,因为每次更新框架时编辑都会消失。也就是说,完全去掉
Castable
并用
Decodable
的扩展替换它,对结果没有任何影响。你有没有找到一些关于为什么会导致不同行为的文档?至于扩展在哪里,我同意我把它放在哪里并不重要。但是Swift编译器的错误历史教会了我不要想当然。结合(可能)有缺陷的优化器和模块边界,一切都是可能的。例如,在已经知道实现的情况下,它可能会错误地优化
decode()
的动态调度(
Bool
)。但我只是猜测。谢谢你的建议。尽管可能,但编辑框架代码并不可取,因为每次更新框架时编辑都会消失。也就是说,完全去掉
Castable
并用
Decodable
的扩展替换它,对结果没有任何影响。你有没有找到一些关于为什么会导致不同行为的文档?至于扩展在哪里,我同意我把它放在哪里并不重要。但是Swift编译器的错误历史教会了我不要想当然。结合(可能)有缺陷的优化器和模块边界,一切都是可能的。例如,在已经知道实现的情况下,它可能会错误地优化
decode()
的动态调度(
Bool
)。但我只是在猜测。
extension Bool : Decodable, Castable {
     static func decode() {
        print("my specialized decode for Bool")
    }
}