【发布时间】:2017-05-07 14:08:28
【问题描述】:
我有以下快速代码:
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”的具体类型我看到了其他一些答案,但无法将我的问题与其中任何一个联系起来。
【问题讨论】:
-
请阅读stackoverflow.com/…的结果
-
比较Protocol doesn't conform to itself? - 简单的解决方法就是扩展
extension Array where Element == Animal {...}。尽管如此,鉴于您只使用Bird元素,您可能需要考虑将其设为extension Sequence where Iterator.Element == Bird,并在调用之前执行(懒惰的)flatMap,以便仅过滤Bird元素。 -
谢谢它的工作
标签: swift protocols extension-methods