Коллекции типов протоколов - протокольно-ориентированное программирование
Мне нужна коллекция типа протокола: в данном случае я хочу, чтобы переменная 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
2 ответа
Вы не должны наследовать свой протокол от
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 и наследование протокола» и « Как использовать универсальный протокол в качестве типа переменной» для обсуждения этой темы. По этим ссылкам также обсуждаются возможные решения.