-
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 를통해 데이터를 넣어주고있다.
'개발 > Swift' 카테고리의 다른 글
재사용 가능한 tableview cell nib만들기 (0) 2021.09.02 expandable + dynamic height tableview cell 구현하기 (0) 2021.09.02 RxFlow 적용기 (2) 2021.05.25 Swift 커스텀뷰 만들어서 재사용하기 (UIButton) (3) 2021.04.22 Swift Fastlane + SwiftLint + GitlabCI 연동하기 (0) 2021.04.09