Коллекции типов протоколов - протокольно-ориентированное программирование

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

Другие вопросы по тегам