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