协议类型的集合 - 面向协议的编程

问题描述

我想要一个协议类型的集合:在这种情况下,我想要一个变量“party”是一个 GameCharacter 类型的数组,这样我就可以将所有符合 GameCharacter 的内容放入其中。

下面的代码产生以下错误

Protocol 'GameCharacter' 只能用作通用约束,因为 它有自己或相关的类型要求

这里有什么问题?怎么做才对?


protocol GameCharacter: Identifiable {
    var name: String {get}
    var maxHealt: Int {get}
    var healt: Int { get set }

    }

struct Warrior: GameCharacter,fighter {
    var name: String
    var maxHealt: Int
    var healt: Int
    var armor: Armor
    var weapon: Weapon
    var resistence: Int
    var id: String {
        return name
    }
}

var party: [GameCharacter] <--- error

解决方法

在这种情况下,您不应从 Identifiable(具有泛型)继承您的协议,而是显式添加 id 然后下面(简化)是可编译的

protocol GameCharacter {
    var id: String { get }     // << here !!
    var name: String {get}
    var maxHealt: Int {get}
    var healt: Int { get set }
    
}

struct Warrior: GameCharacter {
    var name: String
    var maxHealt: Int
    var healt: Int
    var resistence: Int
    var id: String {        // << here !!
        return name
    }
}
,

我相信 Identifiable 是具有关联类型的协议。不幸的是,Swift 不支持您要实现的目标,目前

请参阅 Swift associated types and protocol inheritanceHow to use generic protocol as a variable type 以了解有关此主题的讨论。这些链接也讨论了可能的解决方案。