ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Realm swift struct 타입, List타입 수정 하는법
    개발/Swift 2021. 8. 3. 17:46

    내부 저장소에 리스트를 저장해야할 일이생겼다.

    moduleList 라는 [ModuleModel] 배열을 저장하고 꺼내 쓰고 수정하는것이 목적이다.

    우선 ModuleModel 은 struct타입이다.

     

    struct ModuleModel { let id: String! let title: String! }

    struct ModuleModel {
        let id: String!
        let title: String!
        
    }

    struct은 사실 realm에 넣을수 없다. Object 타입만 사용 가능하다.

    대신에 비슷한 Object 클래스를 만들어준후 넣어줄수 있다.

    그리고 struct가 필요한 상황에 타입을 바꿔주는 방법으로 구현한다.

     

    class RealmModuleModel : Object {
        @objc dynamic var id : String = ""
        @objc dynamic var title : String = ""
    }

    이렇게 비슷한 Object를 만들어 준 후에 struct와 object간 형 변환이 가능하도록

    extenstion에 구현해준다.

     

    extension ModuleModel : Persistable{
    
        init(managedObject: RealmModuleModel) {
            self.id = managedObject.id
            self.title = managedObject.title
        }
    
        func managedObject() -> RealmModuleModel {
            let module = RealmModuleModel()
            module.id = self.id
            module.title = self.title
            return module
        }
    
    }
    
    
    public protocol Persistable {
        associatedtype ManagedObject : RealmSwift.Object
    
        init(managedObject : ManagedObject)
    
        func managedObject() -> ManagedObject
    }

    Persistable 프로토콜을 받아 다른곳에서 사용할수있고

    struct → object 의 경우 struct.managedObject

    object → struct 의 경우 struct.init(object)

    이렇게 간단히 형변환이 가능하다.

    그럼 이제 object 리스트를 넣고 싶었던 상위의 Object에 넣으려한다.

     

    class AppSettingModel : Object {
        @objc dynamic var showTutorial: Bool = true
        @objc dynamic var languageType : String = "ko"
        let moduleList = List<RealmModuleModel>()
        
    }

    moduleList 라는 비어있는 object list를 만들어줬다.

    let 으로 선언해야 데이터가 유지된다.

    데이터를 수정할 때 moduleList = newModuleList로 수정이 불가능하다.

    let 타입이 때문이며 var 타입의경우 데이터가 보존되지 않는 오류가 있었다.

    따라서 append 를 통해 데이터를 수정해야 한다.

     

    func saveModuleList(moduleList:[ModuleModel]) {
            if let appSettingModel = realm.objects(AppSettingModel.self).first {
                try! realm.write{
                    appSettingModel.moduleList.removeAll()
                    moduleList.forEach { module in
                        print("module \(module)")
                        appSettingModel.moduleList.append(module.managedObject())
    
                    }
                }
            }
        }

    appSettingModel Object 안에있는 moduleList Object를 수정하는 과정이다.

    moduleList라는 struct 배열에 반복문을 돌린후 struct.managedObject를 통해 형변환을 해준후

    moduleList Object append 를통해 데이터를 넣어주고있다.

    댓글

Designed by Tistory.