问题描述
我想要一个协议类型的集合:在这种情况下,我想要一个变量“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 inheritance 和 How to use generic protocol as a variable type 以了解有关此主题的讨论。这些链接也讨论了可能的解决方案。