UserDefaults.standard.object (ключ) всегда ноль - PullRequest
0 голосов
/ 17 сентября 2018

В моем случае UserDefaults.standard.object() всегда возвращает ноль. Я не понимаю почему . Пожалуйста помоги. Я использую Swift 4.2 и Xcode 9.x. В моем проекте несколько файлов: swift и objC. Если я устанавливаю значение из кода objC (NSUserDefaults ...), то все работает нормально. Значение существует.

Мой класс 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 я вызываю первый 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-класса):

[DataManager saveDataWithSurname:surname name:name patronymic:patronymic];

Класс 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)
    }
}

Ответы [ 4 ]

0 голосов
/ 17 сентября 2018

Вы должны вернуть простой объект вместо замыкания. Кроме того, 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
}
0 голосов
/ 17 сентября 2018

Глупая ошибка:

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_")

Ключ <-> Значение.:)

0 голосов
/ 17 сентября 2018

Как обсуждение func set(_ value: Any?, forKey defaultName: String):

Параметром value могут быть только объекты списка свойств: NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Для объектов NSArray и NSDictionary их содержимое должно быть объектами списка свойств.

Таким образом, объектом по умолчанию должен быть список свойств - то есть экземпляр (или для коллекций, комбинация экземпляров) NSData, NSString, NSNumber, NSDate, NSArray, или NSDictionary. Если вы хотите сохранить какой-либо другой тип объекта, вы обычно должны заархивировать его, чтобы создать экземпляр NSData.

Попробуйте решение здесь .

...