swift - 条件一致性 : Using 'T' as a concrete type conformance to 'T' is not supported

标签 swift

<分区>

我有一些非常基本的代码,因为我正在尝试了解条件一致性:

protocol Animal {
    var name: String { get }
}

protocol Social {
    func speak()
}

class Cat: Animal, Social {
    var name: String

    init(name: String) {
        self.name = name
    }

    func speak() {
        print("Meow")
    }
}

class Dog: Animal, Social {
    var name: String

    init(name: String) {
        self.name = name
    }

    func speak() {
        print("Ruff")
    }
}

extension Array: Social where Element: Social {
    func speak() {
        forEach { $0.speak() }
    }
}

let array: [Social] = [Dog(name: "Rocco"), Cat(name: "Gozer")]
array.speak()

当尝试执行最后一行 array.speak() 时,出现错误:

“不支持使用‘社交’作为符合协议(protocol)‘社交’的具体类型。”

我阅读扩展 Array 行的方式是这样的: 如果数组中的所有元素都符合 Social,则该数组符合协议(protocol) Social。这个对吗?以下工作正常:

array.forEach { social in
    social.speak()
}

这让我相信我做对了,就声明/初始化数组而言。

我查看了多篇关于条件一致性的帖子,但没有一篇只是告诉我如何声明数组(如果这是我的问题)以便使用它并符合协议(protocol) Social.

我目前正在阅读 Ray Wenderlich 的“Swift Apprentice”一书,他们展示了除了在示例中实际使用代码之外的所有内容。

任何帮助将不胜感激

最佳答案

将扩展名更改为 Element is 而不是 Element conforms to

extension Array where Element == Social {
    func speak() {
        forEach { $0.speak() }
    }
}

约束 Array : Social 是无关紧要的。

关于swift - 条件一致性 : Using 'T' as a concrete type conformance to 'T' is not supported,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53805369/

相关文章:

ios - Unity-iOS:尚未配置默认Firebase应用

swift - SKSpriteNode 未加载到屏幕上?

ios - 如何在ios中获取今天日期的开始和结束时间?

swift - 尝试创建带有标签的 ScrollView

ios - 在 iOS swift 中创建一个保存在 Parse 中的计数器

ios - Xcode 11 Swift 5 - 无法安装应用程序(无法加载 info.plist 文件)

xcode - 在 Xcode 7.2 中将 Storyboard View Controller 链接到它自己的 viewcontroller.swift

swift - 返回确认协议(protocol)的结构类型

ios - 如何使用用户输入在 Firebase 中为 child 命名?

ios - 如何在 ios,swift 中初始化我的 ViewController 扩展中的 ui 元素