개발/Swift

Realm swift struct 타입, List타입 수정 하는법

덤벨로퍼 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 를통해 데이터를 넣어주고있다.