将输入的值与 swift 中的现有值相加

Adding up entered value with an existing value in swift

我有一个文本字段,我可以在其中输入双精度值,它将显示在第二个视图控制器的标签上。该值将使用 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()
    }
}

(快速)回答为什么会这样:您在 UserDetails.standard 中设置了初始值,这是正确的,但是您每次都在更新新的 UserDefaults() 对象中的值.

您也可以稍微精简一下代码,因为其中有一些不必要的东西。最终你只需要将新值添加到现有值,所以你真的不需要检查现有值是否 == 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)"
}

另一种方法是对 weekOneAmount 使用自定义 getter 和 setter,这样您就可以抽象出大部分调用并将其作为普通变量使用。

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

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