Swift 4 - Как заставить функцию установить переменную вне этой функции - PullRequest
0 голосов
/ 19 января 2019

Так что я только начал со Свифта на днях.В процессе работы с каким-то кодом я попытался написать функцию, которая позволяла бы атаковать целевого игрока и противника и уменьшала бы HP врагов на величину силы атаки игрока.Внутри функции все работает нормально, но я не могу найти способ заставить ее воздействовать на выбранного врага за пределами функции.Может быть, это что-то, что придет на более позднем уроке, но в моей голове это должно быть что-то простое, что я не могу понять.

Вот код, который я использую.

struct Player {
    var maxHP: Int
    var currentHP: Int
    var maxMP: Int
    var currentMP: Int
    var currentLVL: Int
    var damageATT: Int
}

struct Enemy {
    var maxHP: Int
    var currentHP: Int
    var damageAtt: Int
}

var alexRider = Player(maxHP: 100, currentHP: 100, maxMP: 100, currentMP: 100, currentLVL: 1, damageATT: 5)
var enemyOne = Enemy(maxHP: 20, currentHP: 20, damageAtt: 2)
var enemyTwo = Enemy(maxHP: 40, currentHP: 40, damageAtt: 4)

func attackTarget(attacker player: Player, enemy target: Enemy) {
    var attackTAR = target
    attackTAR.currentHP -= player.damageATT
    print("Dealt \(player.damageATT) damage!")
    print("Enemy now has \(attackTAR.currentHP) health remaining")
}

attackTarget(attacker: alexRider, enemy: enemyTwo)
print(enemyTwo.currentHP)

Очевидно, что когда я печатаю currentHP в конце кода, он такой же, как и начатый, поскольку область видимости переменных внутри функции не выходит за пределы.Команды печати внутри функции работают нормально, чтобы показать величину ущерба и оставшиеся HP экземпляра внутри.

Есть ли что-то простое, что мне здесь не хватает?Опять же, я знаю, что это должно быть что-то простое, но только начав с этим, я надеялся, что кто-то может указать мне правильное направление.

Спасибо.

1 Ответ

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

Итак, в Swift мы все равно можем перейти по ссылке. Это позволяет туда, где наши параметры являются изменяемыми, потому что в случае по умолчанию, таком как ваш, они являются let переменными и не изменяемы.

То, что мы можем сделать, это

attackTarget(attacker: alexRider, enemy: &enemyTwo)

а также

func attackTarget(attacker player: Player, enemy target: inout Enemy) {

Здесь вы можете видеть, что inout аналогично передаче переменной по ссылке в C, мы просто должны сообщить об этом компилятору Swift. Это позволит вашей переменной изменять собственные переменные.

...