UserDefaults.standard.object(key) 始终为零
UserDefaults.standard.object(key) always nil
在我的例子中 UserDefaults.standard.object()
总是 returns 零。
我不明白 为什么 。请帮忙。我使用 swift 4.2 和 Xcode 9.x。
我的项目有多个文件:swift 和 objC。如果我从 objC 代码(NSUserDefaults ...)设置值,那么一切正常。值存在。
我的 class B 在 Swift-文件:
import Foundation
@objc class Preferences : NSObject{
/**
Сохранение в локальном хранилище данных
:param: key ключ (название параметра
:param: value значение - любой тип данных
*/
public static func saveValue (key:String, value:Any) -> (){
UserDefaults.standard.set(value, forKey: key)
UserDefaults.standard.synchronize()
}
/**
Получить данные из локального хранилища
:param: key ключ (название параметра)
:returns: Any значение - любой тип данных
*/
public static func getValue (key:String) -> (Any?){
let val = UserDefaults.standard.object(forKey: key)
return val // ------- always NIL
// if let type1 = val as? String{
// return type1
// }else if let type2 = val as? Int{
// return type2
// }else if let type3 = val as? Double{
// return type3
// }else{
// return val;
// }
}
}
来自 objC class 我先调用 swift-func.
objC(检查值):
if (![[Preferences getValueWithKey:@"surname_"] isEqualToString:@""]){
[surnameF setText:[Preferences getValueWithKey:@"surname_"]];
[nameF setText:[Preferences getValueWithKey:@"name_"]];
[patronymicF setText:[Preferences getValueWithKey:@"patronymic_"]];
}
objC(调用swift-class设置值):
[DataManager saveDataWithSurname:surname name:name patronymic:patronymic];
Class A 在 Swift-文件:
@objc class DataManager : NSObject{
public static func saveData(surname: String, name: String, patronymic: String){
//Сохранить локально
Preferences.saveValue(key: surname, value1: "surname_")
Preferences.saveValue(key: name, value1: "name_")
Preferences.saveValue(key: patronymic, value1: "patronymic_")
let sCommand = SimpleCommand()
sCommand.command = "setUserData"
var userData = [String:String]()
userData["user_surname"] = surname
userData["user_name"] = name
userData["user_patronymic"] = patronymic
sCommand.params["userData"] = userData
NetHelper.sendJSONPureRequest(
sCommand: sCommand,
onSuccess: { (sAnswer) in
EasyDialog.showAlert(title: "Уведомление", message: sAnswer.messageText!)
}) { (errMsg) in
EasyDialog.showAlert(title: "Ошибка", message: errMsg)
}
}
作为func set(_ value: Any?, forKey defaultName: String)
的讨论:
The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. For NSArray and NSDictionary objects, their contents must be property list objects.
因此默认对象必须是 属性 列表 - 即 NSData
、NSString
、[= 的一个实例(或集合,实例的组合) 13=]、NSDate
、NSArray
或 NSDictionary
。如果要存储任何其他类型的对象,通常应该将其存档以创建 NSData
.
的实例
尝试解决方案 。
您应该return 简单对象而不是闭包。
此外,synchronize
将被弃用,您可以将其删除。
试试这个固定代码。
public static func saveValue (key: String, value: Any) {
UserDefaults.standard.set(value, forKey: key)
}
public static func getValue (key:String) -> Any? {
let val = UserDefaults.standard.object(forKey: key)
return val
}
愚蠢的错误:
public static func saveData(surname: String, name: String, patronymic: String){
//Сохранить локально
Preferences.saveValue(key: surname, value1: "surname_")
Preferences.saveValue(key: name, value1: "name_")
Preferences.saveValue(key: patronymic, value1: "patronymic_")
键 <-> 值。 :)
Swift 5个非常简单的方法
Attempt to set a non-property-list object as an NSUserDefaults
在我的例子中 UserDefaults.standard.object()
总是 returns 零。
我不明白 为什么 。请帮忙。我使用 swift 4.2 和 Xcode 9.x。
我的项目有多个文件:swift 和 objC。如果我从 objC 代码(NSUserDefaults ...)设置值,那么一切正常。值存在。
我的 class B 在 Swift-文件:
import Foundation
@objc class Preferences : NSObject{
/**
Сохранение в локальном хранилище данных
:param: key ключ (название параметра
:param: value значение - любой тип данных
*/
public static func saveValue (key:String, value:Any) -> (){
UserDefaults.standard.set(value, forKey: key)
UserDefaults.standard.synchronize()
}
/**
Получить данные из локального хранилища
:param: key ключ (название параметра)
:returns: Any значение - любой тип данных
*/
public static func getValue (key:String) -> (Any?){
let val = UserDefaults.standard.object(forKey: key)
return val // ------- always NIL
// if let type1 = val as? String{
// return type1
// }else if let type2 = val as? Int{
// return type2
// }else if let type3 = val as? Double{
// return type3
// }else{
// return val;
// }
}
}
来自 objC class 我先调用 swift-func.
objC(检查值):
if (![[Preferences getValueWithKey:@"surname_"] isEqualToString:@""]){
[surnameF setText:[Preferences getValueWithKey:@"surname_"]];
[nameF setText:[Preferences getValueWithKey:@"name_"]];
[patronymicF setText:[Preferences getValueWithKey:@"patronymic_"]];
}
objC(调用swift-class设置值):
[DataManager saveDataWithSurname:surname name:name patronymic:patronymic];
Class A 在 Swift-文件:
@objc class DataManager : NSObject{
public static func saveData(surname: String, name: String, patronymic: String){
//Сохранить локально
Preferences.saveValue(key: surname, value1: "surname_")
Preferences.saveValue(key: name, value1: "name_")
Preferences.saveValue(key: patronymic, value1: "patronymic_")
let sCommand = SimpleCommand()
sCommand.command = "setUserData"
var userData = [String:String]()
userData["user_surname"] = surname
userData["user_name"] = name
userData["user_patronymic"] = patronymic
sCommand.params["userData"] = userData
NetHelper.sendJSONPureRequest(
sCommand: sCommand,
onSuccess: { (sAnswer) in
EasyDialog.showAlert(title: "Уведомление", message: sAnswer.messageText!)
}) { (errMsg) in
EasyDialog.showAlert(title: "Ошибка", message: errMsg)
}
}
作为func set(_ value: Any?, forKey defaultName: String)
的讨论:
The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. For NSArray and NSDictionary objects, their contents must be property list objects.
因此默认对象必须是 属性 列表 - 即 NSData
、NSString
、[= 的一个实例(或集合,实例的组合) 13=]、NSDate
、NSArray
或 NSDictionary
。如果要存储任何其他类型的对象,通常应该将其存档以创建 NSData
.
尝试解决方案
您应该return 简单对象而不是闭包。
此外,synchronize
将被弃用,您可以将其删除。
试试这个固定代码。
public static func saveValue (key: String, value: Any) {
UserDefaults.standard.set(value, forKey: key)
}
public static func getValue (key:String) -> Any? {
let val = UserDefaults.standard.object(forKey: key)
return val
}
愚蠢的错误:
public static func saveData(surname: String, name: String, patronymic: String){
//Сохранить локально
Preferences.saveValue(key: surname, value1: "surname_")
Preferences.saveValue(key: name, value1: "name_")
Preferences.saveValue(key: patronymic, value1: "patronymic_")
键 <-> 值。 :)
Swift 5个非常简单的方法
Attempt to set a non-property-list object as an NSUserDefaults