UserDefault с nsmutabledictionary не удалось преобразовать значение типа '__NSSingleEntryDictionaryI' в NSMutableDictionary - PullRequest
1 голос
/ 04 марта 2020

Я новичок в Ios разработке. В настоящее время одна функция возвращает NSMutableDictionary, который был сохранен в userDefaults. Но когда я извлекаю значения из userdefault, он возвращает неправильный формат NSMutableDictionary, который не может проанализировать NSMutableDictionary и вернуть обратно ошибку "не удалось привести значение типа '__NSSingleEntryDictionaryI' к NSMutableDictionary".

Функция, которая возвращает NSMutableDictionary

func initializeStructureOfControl () -> NSMutableDictionary {
        var parentSlideControl = NSMutableDictionary()

        var slideControl = NSMutableDictionary()
        slideControl.setValue(NSMutableDictionary(), forKey: UserDefaultKeys.fdtControlKey)
        slideControl.setValue(NSMutableDictionary(), forKey: UserDefaultKeys.pdtControlsData)
        slideControl.setValue(NSMutableDictionary(), forKey: UserDefaultKeys.eeControlsData)
        slideControl.setValue(NSMutableDictionary(), forKey: UserDefaultKeys.fbeControlsData)

        parentSlideControl.setValue(slideControl, forKey: UserDefaultKeys.slideControlKey)

        return parentSlideControl

    }

Инициализация по умолчанию для пользователя

UserDefaults.standard.setValue( initializeStructureOfControl(), forKey: UserDefaultKeys.slideControlKey)

Получение значения

UserDefaults.standard.object(forKey: UserDefaultKeys.slideControlKey)

Значение, которое было сохранено в userdefault:

  ▿ some : 1 element
    ▿ 0 : 2 elements
      ▿ key : slideControlsData
      ▿ value : 4 elements
        ▿ 0 : 2 elements
          - key : fbeControlsData
          - value : 0 elements
        ▿ 1 : 2 elements
          - key : eeControlsData
          - value : 0 elements
        ▿ 2 : 2 elements
          - key : fdtControlsData
          - value : 0 elements
        ▿ 3 : 2 elements
          - key : pdtControlsData
          - value : 0 elements

Значение, полученное от userdefault

▿ some : 1 element
    ▿ 0 : 2 elements
      ▿ key : slideControlsData
      ▿ value : 4 elements
        ▿ 0 : 2 elements
          - key : fbeControlsData
          - value : 0 elements
        ▿ 1 : 2 elements  
          - key : eeControlsData
          - value : 0 elements {.....}
        ▿ 2 : 2 elements 
          - key : fdtControlsData
          - value : 0 elements {.....}
        ▿ 3 : 2 elements  
          - key : pdtControlsData
          - value : 0 elements {.....}

, хотя оно работает в ios 12 или до устройства (которое возвращает то же значение, которое было сохранено), но в ios 13 и позже возвращает вышеуказанную строку формата вместо сохраненной в пользовательской настройке по умолчанию.

1 Ответ

1 голос
/ 04 марта 2020

Ошибка

не смогла привести значение типа '__NSSingleEntryDictionaryI' к NSMutableDictionary

, потому что object(forKey возвращает im изменяемый объект , Чтобы получить изменяемый словарь, вы должны создать новый, например

var slideControl = NSMutableDictionary(dictionary: (UserDefaults.standard.object(forKey: UserDefaultKeys.slideControlKey) as! NSDictionary))

Однако все типы коллекций NS(Mutable)... настоятельно не рекомендуются в Swift. Это собственная версия

func initializeStructureOfControl () -> [String:Any] {
    let slideControl = [UserDefaultKeys.fdtControlKey : [String:Any](),
                        UserDefaultKeys.pdtControlsData : [String:Any](),
                        UserDefaultKeys.eeControlsData : [String:Any](),
                        UserDefaultKeys.fbeControlsData : [String:Any]()]
    return [UserDefaultKeys.slideControlKey : slideControl]
}

Сохраните ее в UserDefaults

UserDefaults.standard.set(initializeStructureOfControl(), forKey: UserDefaultKeys.slideControlKey)

И прочитайте ее

var slideControl = UserDefaults.standard.dictionary(forKey: UserDefaultKeys.slideControlKey)

Словарь может изменяться как var iable , Но учтите, что словари Swift являются типами значений. Вы должны изменить его на месте. Более эффективным решением могут быть пользовательские структуры вместо словарей и протокол Codable для сохранения объекта в UserDefaults.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...