Странная вещь, происходящая при настройке и получении массива в swift4

#ios #realm #swift4

#iOS #область #swift4

Вопрос:

Я использую класс LocalSubject.swift, который я храню в RealmDB.

 class LocalSubject: Object{

    @objc dynamic var subjectName: String?
    private var modules: [Module] = [Module]()
    @objc dynamic var moduleArrayJSON: String? = nil

    public func addModule(module: Module){
        modules.append(module)
    }

    public func setModules(modules: [Module]){
        self.modules = modules
        print("LocalSubject.swift > setModules() > "   String(describing: modules.count)   " > "   String(describing: self.modules.count))
  }

    public func getModules()-> [Module]{
         print("LocalSubject.swift > getModules() > "   String(describing: modules.count)   " > "   String(describing: self.modules.count))
        return modules.sorted(by: { $0.displayOrder! < $1.displayOrder!})
    }
} 
  

Я сохраняю класс в БД путем преобразования массива «modules» в json и обратно.
В приведенной ниже функции «modules» вычисляется правильно с count = 3, затем я устанавливаю его в объекте «maths» LocalSubject. Теперь, когда я пытаюсь получить «модули» из «математики», я всегда получаю пустой массив.

    public func createModuleArrayFromJSONInSubjects(){
            let modules = getModuleArrayFromJSON(moduleArrayJSON: (maths?.moduleArrayJSON)!)
            for module in modules{
                print("-> "   module.title!)
            }
            maths?.setModules(modules: modules)
            for module in (maths?.getModules())!{
                print("---> "   module.title!)
            }
  }
  

Я не могу разобраться в этом, это кажется странным.
Я что-то упускаю?

Комментарии:

1. Что такое Module type — это тоже объект Realm? И maths объект управляется Realm (т. Е. хранится в Realm)?

Ответ №1:

Объекты Realm не поддерживают типы массивов, вместо этого вы должны использовать тип Realm List для поддержания ссылок на другие объекты Realm. Если Module это не подкласс Realm object, вы не можете сохранить ссылку на него. Смотрите здесь: https://realm.io/docs/swift/latest/#models

Итак, есть два варианта:

  1. Либо измените modules свойство на List и сохраните Module объекты в Realm тоже, либо
  2. Нужно ли сохранять modules свойство, если вы сохраняете JSON? Вы могли бы продолжать хранить только строку JSON и создавать modules вычисляемое свойство (для которого вам понадобится getter , и вы можете выбрать, создавать setter или нет).

Вам придется выбирать дальнейший путь в зависимости от ваших вариантов использования.

Комментарии:

1. Спасибо за руководство. Я выбрал вариант 2, и у меня все получилось.