[英]UserDefaults.standard.object(forKey: “foo”) as! Double
[英]UserDefaults.standard.object(key) always nil
在我的情況下, UserDefaults.standard.object()
始終返回nil。 我不明白為什么 。 請幫忙。 我使用Swift 4.2和Xcode9.x。 我的項目有多個文件:swift和objC。 如果我從objC代碼(NSUserDefaults ...)設置值,則一切正常。 價值存在。
我在Swift文件中的B類 :
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類,我首先調用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];
Swift文件的A類 :
@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)
:
value參數只能是屬性列表對象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。 對於NSArray和NSDictionary對象,它們的內容必須是屬性列表對象。
因此,默認對象必須是屬性列表-即NSData
, NSString
, NSNumber
, NSNumber
, NSDate
, NSArray
或NSDictionary
的實例(或對於集合而言,是實例的組合)。 如果要存儲任何其他類型的對象,通常應將其歸檔以創建NSData
的實例。
在這里嘗試解決方案。
愚蠢的錯誤:
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非常簡單的方法
https://stackoverflow.com/questions/19720611/attempt-to-set-a-non-property-list-object-as-an-nsuserdefaults/56625605#56625605
您應該返回簡單對象而不是閉包。 另外,不贊成使用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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.