Это сочетание числовых типов (Int32, Float, Int) довольно запутанно. В общем, вы хотите использовать Int или Double. Все остальные варианты следует использовать только в случае крайней необходимости, например, если API требует другого типа. Итак, давайте предположим, что dailyCoalAccumulate
- это Int, и переключим все остальное на Int:
let coalPileHolding = 0
if let coalPile = Int(coalPileLabel.text!) {
let totalCoal = dailyCoalAccumulate + coalPile
let coalPileHolding = Int((coalPileHoldingLabel.text as! NSString).intValue)
if totalCoal > coalPileHolding {
let coalPileHolding = totalCoal
}
coalPileLabel.text = String(totalCoal)
UserDefaults.standard.set(totalCoal, forKey:"totalCoal")
}
callOutLabel.text = String(dailyCoalAccumulate)
Здесь intValue
API NSString
возвращает Int32
, но я немедленно преобразую его в обычный Int. Но, конечно, есть лучший способ сделать это без необходимости подключаться к Objective-C NSString
. Если строка не содержит числа intValue
, просто возвращается ноль. Мы можем создать то же поведение, когда мы используем инициализатор Int для преобразования строки, а затем заменим значение nil
на ноль: Int(coalPileHoldingLabel.text!) ?? 0
.
Тогда у нас есть три разные переменные с именем coalPileHolding
. Поскольку они определены в разных областях, они могут иметь одно и то же имя, но все еще являются разными переменными. Я предполагаю, что вы хотите обновить переменную coalPileHolding
. Иначе присваивание во внутреннем if не имеет смысла - компилятор даже предупреждает об этом.
Итак, давайте изменим coalPileHolding
на var
и обновим его значение.
var coalPileHolding = 0
if let coalPile = Int(coalPileLabel.text!) {
let totalCoal = dailyCoalAccumulate + coalPile
coalPileHolding = Int(coalPileHoldingLabel.text!) ?? 0
if totalCoal > coalPileHolding {
coalPileHolding = totalCoal
}
coalPileLabel.text = String(totalCoal)
UserDefaults.standard.set(totalCoal, forKey:"totalCoal")
}
callOutLabel.text = String(dailyCoalAccumulate)