#swift #object #optional #userdefaults
#swift #объект #тип опции #ошибки пользователя
Вопрос:
Очень новичок в Swift, поэтому здесь очень простая проблема, но я изо всех сил пытаюсь развернуть необязательное значение из UserDefaults
сохраненного значения. Значение для UID равно «dan». Вот код:
override func viewDidLoad() {
super.viewDidLoad()
let uidObject1 = UserDefaults.standard.object(forKey: "UID")
if let uid = uidObject1 {
updateUsername.setTitle("(uid)", for: UIControlState.normal)
print("on load (uid)")
}
}
Это изменяет ярлык кнопки updateUsername, а также выводит на консоль следующее…
при загрузке необязательно («dan»)
Я не могу избавиться от Optional(). Я попытался развернуть uid.
print(«при загрузке (uid!)»)
как сообщает мне Xcode, я не могу принудительно развернуть значение необязательного типа «Any».
Из поиска я понял, что проверка — if let uid = uidObject1
— удалила необязательный (), поскольку он выполняется только в том случае, если uidObject1
существует. Может кто-нибудь указать мне правильное направление?
Редактировать: Вот мой установленный код;
@IBAction func updateUsername(_ sender: AnyObject) {
if let uid = userName.text {
UserDefaults.standard.set("(userName.text)", forKey: "UID")
updateUsername.setTitle("(uid)", for: UIControlState.normal)
}
}
ОТВЕТ — Необходимо развернуть набор (userName.text) следующим образом> (userName.text!) РЕШАЕМАЯ. Спасибо Оливеру.
Комментарии:
1. Вероятно, это означает, что вы ранее установили значение по умолчанию для «UID» в строку
Optional("dan")
.
Ответ №1:
Я думаю, что когда вы устанавливаете UID в UserDefaults, вы устанавливаете строку, используя тот же метод, который вы использовали для печати. Однако, если вы не развернете необязательный в этот момент, строка сохраняется как «необязательный (Dan)». Итак, вы правильно разворачиваете приведенный выше код, но строка уже «необязательна (Dan)».
Например, ваш код для установки значения UID, вероятно, выглядит следующим образом
UserDefaults.standard.setValue("(name)", forKey: "UID")
Но имя является необязательным. Имя разворачивания и ваша проблема должны быть исправлены.
Комментарии:
1. Спасибо Оливеру. Я развернул набор userName.text следующим образом — UserDefaults.standard.set(«(userName.text!)», forKey: «UID») — и теперь он не возвращается как необязательный, он действительно был установлен как необязательный. Большое спасибо за вашу помощь.
2. Нет проблем! рад, что смог помочь 🙂
3. Не используйте
setValue
, если вы не знаете и не нуждаетесь в функциональности KVC.4. Это было не предложение, а просто пример того, что я имел в виду.
5. Затем создайте пример, используя правильную вещь и удалите
Value
,set(...
выводит строковый тип.
Ответ №2:
object(forKey:)
возвращает значение типа Any?
. При назначении UID вы должны приводить его к нужному типу, например:
guard let uidObject1 = UserDefaults.standard.object(forKey: "UID") as? String else { return }
или используя string(forKey:)
метод, подобный
guard let uidObject1 = UserDefaults.standard.string(forKey: "UID") else { return }