Realm swift struct 타입, List타입 수정 하는법
내부 저장소에 리스트를 저장해야할 일이생겼다.
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 를통해 데이터를 넣어주고있다.