【问题标题】:Using 'Protocol' as a concrete type conforming to protocol 'Protocol' is not supported不支持使用“协议”作为符合协议“协议”的具体类型
【发布时间】: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
    }
}

编译器不让我编译抱怨: 在递归调用函数 ma​​mmalsEatenByBirds()

时,不支持将“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


【解决方案1】:

修复将Element: Animal 替换为Element == Animal

【讨论】:

  • 如果你这样做,你必须将Bird数组显式转换为Animal。像这样:let mammals = (birds as Animal).mammalsEatenByBirds()。那是愚蠢的(不是你,而是斯威夫特)。
猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 2015-12-24
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多