Как добавить к номеру, который в настоящее время хранится в пользовательских настройках по умолчанию Swift 4

Я хочу, чтобы пользователь мог ввести новый номер, и он будет добавлен к тому, что в настоящее время сохранено в UserDefaults, а затем сохранит этот объединенный номер в пользовательских настройках по умолчанию. Кто-нибудь знает, как это сделать? Спасибо!

Код:

    let typeHoursInt = Double(typeHours.text!)!
    let typePayInt = Double(typePay.text!)!
    totalMade.text = String(typeHoursInt * typePayInt)

    UserDefaults.standard.set(totalMade.text, forKey: "savedMoney")

person Nicole L.    schedule 08.03.2018    source источник
comment
Получите значение, хранящееся в UserDefaults , добавьте к нему то, что только что ввел пользователь, сохраните новое значение в UserDefaults .   -  person Falla Coulibaly    schedule 09.03.2018


Ответы (3)


Это делает то, что вы просите. Вы должны хранить свою переменную totalMade в пользовательских настройках по умолчанию как Double, а не String. Смотри ниже:

// your original code
let typeHoursInt = Double(typeHours.text!)!
let typePayInt = Double(typePay.text!)!

let total = typeHoursInt * typePayInt

totalMade.text = String(total)

// saving original value in User Defaults
UserDefaults.standard.set(total, forKey: "savedMoney")

// retrieving value from user defaults
var savedMoney = UserDefaults.standard.double(forKey: "savedMoney")

// adding to the retrieved value
savedMoney = savedMoney + 5.0

// resaving to User Defaults
UserDefaults.standard.set(savedMoney, forKey: "savedMoney")
person podomunro    schedule 08.03.2018
comment
Благодарю за ваш ответ! Я получаю пару Value типа «Double» без ошибок «текста» члена - есть идеи, как это исправить? - person Nicole L.; 11.03.2018
comment
@НикольЛ. А, это потому, что имя вашего текстового поля и имя переменной для «totalMade» совпадают. Я обновлю ответ. - person podomunro; 11.03.2018
comment
Это работает! Итак, чтобы получить значение того, что вводит пользователь, я бы использовал totalMade и преобразовал его из String в Double и заменил «5.0»? Еще раз большое спасибо - я все еще учусь! - person Nicole L.; 11.03.2018
comment
@НикольЛ. Да, замените его текстовым полем, которое пользователь использует для ввода значения. Если этот ответ помог вам, пожалуйста, отметьте его как правильный ответ! - person podomunro; 11.03.2018
comment
Большое спасибо за вашу помощь @podomunro! Пожалуйста, дайте мне знать, если есть что-то еще, что я могу сделать, чтобы помочь вам с вашей оценкой или чем-то еще! - person Nicole L.; 11.03.2018

Не сохраняйте строки в userDefaults. Сохранить номера.

Затем:

  1. Прочитайте значение по умолчанию.

  2. Добавьте новое значение к вновь прочитанному значению

  3. Сохраните новую сумму обратно к значениям по умолчанию.

person Duncan C    schedule 08.03.2018
comment
UserDefaults имеет удобные методы double(forKey:)/integer(forKey:) (и соответствующие методы set для обоих типов), которые позволяют беспрепятственно читать и записывать Ints и double. - person Duncan C; 09.03.2018

Ниже вы найдете "8" и "20", которые заменяют typeHours.text и typePay.text соответственно.

  UserDefaults.standard.set(535, forKey: "savedMoney")

  if let typeHoursInt = Int("8"), let typePayInt = Int("20") {
    let totalMade = typeHoursInt * typePayInt
    let newTotal = UserDefaults.standard.integer(forKey: "savedMoney") + totalMade
    UserDefaults.standard.set(newTotal, forKey: "savedMoney")
  }
person jnblanchard    schedule 08.03.2018
comment
Я не голосовал против, но у этого кода есть несколько проблем. Никогда не используйте setValue(forKey:) или value(forKey:) для установки/получения значений в UserDefaults. Это методы кодирования ключ-значение. Используйте типобезопасные методы, перечисленные в документации для UserDefaults. - person rmaddy; 09.03.2018
comment
Я не вижу "никогда", кажется довольно стандартным кво. Я все равно поменял. - person jnblanchard; 09.03.2018
comment
Дело в том, что бесполезное использование KVC, когда это не нужно, стоит вам безопасного ввода и добавляет некоторые накладные расходы. Используйте его только тогда, когда он вам действительно нужен. - person rmaddy; 09.03.2018
comment
Нет необходимости обращаться к моему умолчанию как к необязательному? - person jnblanchard; 09.03.2018
comment
Я понятия не имею, что вы имеете в виду под своим последним комментарием. - person rmaddy; 09.03.2018
comment
В этом вопросе указан быстрый 4. Значение для ключа возвращает любое необязательное значение; нет необходимости обрабатывать значения по умолчанию как необязательные? - person jnblanchard; 09.03.2018
comment
Но вы не используете value(forKey:). integer(forKey:) не возвращает необязательный параметр. - person rmaddy; 09.03.2018
comment
Нет, кажется, я не понимаю вашего вопроса. Но мы сбились с пути. Если вы что-то не понимаете и не можете найти ответ, задайте свой вопрос, если хотите. - person rmaddy; 09.03.2018