我有以下的Swift代码:
编译器不允许我编译,抱怨说:在递归调用函数mammalsEatenByBirds()的时候,使用“Animal”作为符合协议“Animal”的具体类型是不被支持的。我看到了一些其他的答案,但无法将我的问题与其中任何一个联系起来。
protocol Animal {
var name: String { get }
}
struct Bird: Animal {
var name: String
var canEat: [Animal]
}
struct Mammal: Animal {
var name: String
}
extension Array where Element: Animal {
func mammalsEatenByBirds() -> [Mammal] {
var eatenMammals: [Mammal] = []
self.forEach { animal in
if let bird = animal as? Bird {
bird.canEat.forEach { eatenAnimal in
if let eatenMammal = eatenAnimal as? Mammal {
eatenMammals.append(eatenMammal)
} else if let eatenBird = eatenAnimal as? Bird {
let innerMammals = eatenBird.canEat.mammalsEatenByBirds()
eatenMammals.append(contentsOf: innerMammals)
}
}
}
}
return eatenMammals
}
}
编译器不允许我编译,抱怨说:在递归调用函数mammalsEatenByBirds()的时候,使用“Animal”作为符合协议“Animal”的具体类型是不被支持的。我看到了一些其他的答案,但无法将我的问题与其中任何一个联系起来。
extension Array where Element == Animal {...}
。尽管如此,考虑到您仅使用'Bird'元素,您可能希望考虑将其设置为extension Sequence where Iterator.Element == Bird
,并在调用之前执行(懒惰的)flatMap
以仅过滤'Bird'元素。 - Hamish