Протокол и аргумент инициализации - PullRequest
0 голосов
/ 16 января 2019

Бывший коллега оставил игру незавершенной и недокументированной.

При чтении его кода я обнаружил:

protocol EnemyMovement {
    func forward(speedPercent: Int)
    func reverse(speedPercent: Int)
    func left(speedPercent: Int)
    func right(speedPercent: Int)
}

protocol Enemy {
    var name: String {get set}
    var enemyMovement: EnemyMovement {get set}

    init (name: String, enemyMovement: EnemyMovement)
}

class EnemyInstance: Enemy {
    var name = "No enemy Name"
    var enemyMovement: EnemyMovement

    required init (name: String, enemyMovement: EnemyMovement) {
        self.name = name
        self.enemyMovement = enemyMovement
//...
}

Я не смог найти конкретный экземпляр EnemyInstance, но если совершенно ясно, как передать строку имени, я не понимаю, как EnemyMovement должен передаваться.

var enemy = EnemyInstance(name: "zombie", enemyMovement?...)

Есть идеи?

1 Ответ

0 голосов
/ 16 января 2019

Поскольку параметр должен иметь тип, соответствующий EnemyMovement, включая эти методы, вы должны передать этот объект.Итак, вы можете попытаться создать пример struct

struct Movements: EnemyMovement {

    func forward(speedPercent: Int) {
        print(speedPercent)
    }

    func reverse(speedPercent: Int) {
        print(speedPercent)
    }

    func left(speedPercent: Int) {
        print(speedPercent)
    }

    func right(speedPercent: Int) {
        print(speedPercent)
    }

}

сейчас как параметр для EnemyInstance инициализатор передать новый экземпляр Movements

var enemy = EnemyInstance(name: "zombie", enemyMovement: Movements())

, затем вы можете вызвать какой-нибудь метод на enemyMovement свойство вашего класса и код внутри этого определенного метода выполняется (в этом случае он должен вывести speedPercent)

required init (name: String, enemyMovement: EnemyMovement) {
    self.name = name
    self.enemyMovement = enemyMovement
    enemyMovement.forward(speedPercent: 2) // prints 2
}
...