gpt4 book ai didi

Swift 协议(protocol)扩展静态方法与父类(super class)和子类的调度

转载 作者:行者123 更新时间:2023-11-30 13:21:20 27 4
gpt4 key购买 nike

我遇到了类似但略有不同的问题:Swift protocol extension method dispatch with superclass and subclass

该问题与协议(protocol)上的静态方法有关。

我有以下代码:

protocol Protocol: class {
static var reuseID: String { get }
}

extension Protocol {
static var reuseID: String { return String(Self) }
}

class MyClass {
func registerClass<T where T: Protocol>(cell: T.Type) {
print(cell) // <-- Prints "SubClass"
print(cell.self) // <-- Prints "SubClass"
print(cell.reuseID) // <-- Prints "SuperClass", expected "SubClass"
}
}

class SuperClass: Protocol {}
class SubClass: SuperClass {}

print(SubClass.self) // <-- Prints "SubClass"
print(SubClass.reuseID) // <-- Prints "SubClass"
MyClass().registerClass(SubClass.self)

如果我从协议(protocol)协议(protocol)中删除reuseID声明,该行为将被“修复”。这不是很落后吗?根据https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future协议(protocol)扩展的调度规则如下:

  1. 如果变量的推断类型是协议(protocol):
  2. 并且该方法是在原始协议(protocol)中定义的,然后调用运行时类型的实现,无论扩展中是否有默认实现。
  3. 并且原始协议(protocol)中未定义该方法,则调用默认实现。
  4. ELSE IF 推断的变量类型是该类型,则调用该类型的实现。

我观察到的行为恰恰相反。知道我做错了什么吗?

最佳答案

对此进行更改怎么样:

extension Protocol {
static var reuseID: String { return String(self) }
}

关于Swift 协议(protocol)扩展静态方法与父类(super class)和子类的调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37745688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com