Как редактировать функцию ввода в Swift? - PullRequest
0 голосов
/ 21 января 2019

Я создаю приложение для бездействующего кликера в Swift и добавляю авто-клики через функцию. Я хочу иметь возможность вводить цену через входные данные для функции, но поскольку входные данные являются постоянными, я не могу добавить к себестоимости на 9%, как хочу каждый раз, когда пользователь нажимает обновление.

Например, если я введу 50.0 в initialPrice, как бы я сделал так, чтобы он увеличивался на 10% каждый раз, когда пользователь щелкает по нему.

func upgrade(intialPrice : Float) {
    var upgradePrice = intialPrice
    AutoClicks += 1
    totalClicks = totalClicks - Int(upgradePrice)
    upgradePrice = upgradePrice + (upgradePrice * 0.1)
    burritoLvl1Label.text = ("$" + "\(Int(upgradePrice))")
}

Я очень новичок в кодировании, поэтому, если вы поймете, как я могу сделать это короче, это было бы очень полезно.

Ответы [ 3 ]

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

Вам нужно передать значение в качестве аргумента inout, чтобы иметь возможность его изменить.Вы также можете сделать вашу реализацию более краткой, используя составные операторы присваивания , +=, -= и *=.Вы также должны убедиться, что вы соответствуете соглашению об именах Swift, которое является loweCamelCase для имен функций и переменных (autoClicks) и UpperCamelCase для типов.

func upgrade(initialPrice: inout Float) {
    autoClicks += 1
    totalClicks -= Int(upgradePrice)
    upgradePrice *= 1.1
    burritoLvl1Label.text = ("$" + "\(Int(upgradePrice))")
}

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

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

В других ответах предложено использовать параметр inout, и хотя это будет работать, я бы не рекомендовал этот шаблон.Как правило, лучше избегать «побочных эффектов» в функциях и использовать inout только в случае очень веской причины.

Более общий подход состоит в том, чтобы иметь функцию, которая return s принимает новое значение.

Вы также можете рассмотреть возможность использования Decimal вместо Float при работе с валютой.

Аналогичным образом, обновление ярлыка, вероятно, не должнобыть в этой функции

func upgrade(initialPrice : Decimal) -> Decimal {
    autoClicks += 1
    totalClicks -= Int(truncating: initialPrice as NSDecimalNumber)
    return initialPrice * 1.1
}

Затем вы можете вызвать эту функцию так:

price = upgrade(initialPrice: price)
burritoLvl1Label.text = ("$" + "\(Int(truncating:price as NSDecimal))")
0 голосов
/ 21 января 2019

Вы должны сделать свой входной параметр как inout .

Подробнее о быстрых функциях .

func upgrade(intialPrice: inout Float) {
    var upgradePrice = intialPrice
    AutoClicks += 1
    totalClicks = totalClicks - Int(upgradePrice)
    upgradePrice = upgradePrice + (upgradePrice * 0.1)
    burritoLvl1Label.text = ("$" + "\(Int(upgradePrice))")
}

Надеюсь, это поможет!

...