1

我想要一个协议类型的集合:在这种情况下,我想要一个变量“ party ”是一个 GameCharacter 类型的数组,这样我就可以把所有符合 GameCharacter 的东西放在里面。

下面的代码产生以下错误:

协议“GameCharacter”只能用作通用约束,因为它具有 Self 或关联的类型要求

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


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
4

2 回答 2

0

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
    }
}
于 2021-07-21T15:34:46.903 回答
0

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

请参考Swift 关联类型和协议继承以及如何使用泛型协议作为变量类型来讨论这个主题。这些链接也讨论了可能的解决方案。

于 2021-07-21T16:09:56.317 回答