继承的 classes [Swift] 中 class function() 的奇怪歧义

Weird ambiguity for class func() in inherited classes [Swift]

我在 Swift 中有一个像这样的简单 class 层次结构。

class Parent {
    var name:String = "Unnamed"
    class func all() -> [Parent] {
        return Dad.all() + Mom.all()
    }
}

class Dad:Parent {
    static var AllDads:[Dad] = []

    class func all() -> [Dad] {
        return AllDads
    }
}

class Mom:Parent {
    static var AllMoms:[Mom] = []

    class func all() -> [Mom] {
        return AllMoms
    }
}

Mom.all().forEach { mom in
    print(mom.name)
}

如果我把它放在工作区中,一切都很好,直到我点击 运行 按钮。此时它告诉我最后一个表达式 Mom.all() 不明确。为什么是这样?有没有办法让 class func 在 subclass 中针对子类型进行细化,并使它们明确无误?

除非您实例化一个 Mom,并在 Mom 的那个实例上调用它,否则它将是不明确的。

原因是 Parent 上的 allMom 上的 all 具有不同的签名。因此,Mom 上的 all 不能覆盖 Parent 上的 all(编译器不需要 override 关键字这一事实也表明了这一点)。这意味着在 Mom 类型上存在两个名为 all 的 class 函数。此外,您传递给 forEach 的闭包未指定参数类型,因此无法确定引用了两个函数中的哪一个。在 forEach 中为 mom 参数分配类型将解决此问题。