При наличии соответствующей ссылки:
https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md#user-defaults
Мы начали использовать оболочки свойств для UserDefaults, оно легко работает снеобязательные свойства.
Однако установка nil необязательного свойства завершается с помощью:
[User Defaults] Попытка установить объект списка не-свойств как NSUserDefaults / CFPreferencesзначение для ключа «someKeyThatWeSet»
Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Попытка вставить нулевой объект списка свойств для ключа« someKeyThatWeSet »'
TheКод ниже можно проверить непосредственно на игровой площадке:
@propertyWrapper
struct C2AppProperty<T> {
let key: String
let defaultValue: T
init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
struct C2User {
@C2AppProperty("userID", defaultValue: nil)
public static var publicUserID: String?
}
print(C2User.publicUserID)
C2User.publicUserID = "edusta"
print(C2User.publicUserID)
C2User.publicUserID = nil
print(C2User.publicUserID)
Ожидаемый:
ноль
Необязательно <"edusta">
ноль
Найдено:
ноль
Необязательно <"edusta">
libc ++ abi.dylib: завершается с неисследованным исключением типа NSException
Что я пробовал до сих пор:
set {
// Comparing non-optional value of type 'T' to nil always returns false.
if newValue == nil {
UserDefaults.standard.removeObject(forKey: combinedKey)
} else {
UserDefaults.standard.set(newValue, forKey: combinedKey)
}
}
WЧто за проверка нужна, чтобы узнать, что newValue равно nil
? Или Optional<nil>
?