快速将输入值与现有值相加

时间:2019-02-01 18:47:16

标签: ios swift nsuserdefaults

我有一个文本字段,可以在其中输入双精度字,它将显示在第二个视图控制器中的标签上。该值将使用UserDefaults保存。我正在努力寻找解决方法,以便能够使用此保存的值并使用在文本字段中输入的新值来增加它。 即第一次输入5;标签显示5。第二次输入3。标签显示8。

我尝试使用下面的if函数,但这没有用。当我第二次输入值时,标签值又回到0,如果再输入一个值,则标签将使用输入的值进行更新。

func saveOne() {
    UserDefaults.standard.set(weekOneTotal, forKey: "WEEKONE")
    secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))
}

func addCorrectSpend () {
    guard let addAmount = convertAmount(input: enterField.text!) else {
        print("Invalid amount")
        return
    }

    if UserDefaults().double(forKey: "WEEKONE") == 0 {    
        weekOneTotal += addAmount  
        secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))    
        saveOne()
    }

    else if UserDefaults().double(forKey: "WEEKONE") > 0 {
        let defaultOne = UserDefaults.standard
        defaultOne.set(defaultOne.double(forKey: "WEEKONE")+addAmount, forKey: "WEEKONE")
        secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))
        saveOne()
    }
}

2 个答案:

答案 0 :(得分:0)

(快速)回答为什么发生这种情况:您正在UserDetails.standard中设置初始值,这是正确的,但是随后您每次都在新的UserDefaults()对象中更新该值。< / p>

由于其中包含一些不必要的内容,因此您也可以减少一些代码。最终,您只需要将新值添加到现有值即可,因此您实际上并不需要检查现有值是否==0。这是我如何重构以上代码的示例:

func addCorrectSpend() {
  guard let addAmount = convertAmount(input: enterField.text!) else {
    print("Invalid amount")
    return
  }
  //Get the existing total (will be 0 if none)
  let weekOneAmount = UserDefaults.standard.double(forKey: "WEEKONE")
  //Add the existing total to the new amount from your textField
  let weekOneTotal = weekOneAmount + addAmount
  //Update UserDefaults.standard to the new value
  UserDefaults.standard.set(weekOneTotal, forKey: "WEEKONE")
  //Set the text
  secondScreen.weekOneText = "\(weekOneTotal)"
}

答案 1 :(得分:0)

有一个不同的方法将吸气和二传手利用定制的weekOneAmount,这样就可以抽象掉你的电话,并作为一个正常的变量,它的大部分工作。

var weekOneAmount: Double {
        get {
            return UserDefaults.standard.double(forKey: "WEEKONE")
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "WEEKONE")
        }
    }

现在,无论何时需要读取或写入,它的行为都与其他任何变量一样。