LoginSignup
2
1

More than 5 years have passed since last update.

RealmのModelを独自の型に変換して使いたい

Posted at

Realmでデータを取得するとResults型で返却されますが、Realmで定義された型を使いたくない時の内容になります。

目的

Realmで取得した内容はRealmSwift.Results型で返却されます。ただ、レイヤーアーキテクチャで言うとインフラ層に位置するので、個人的にView, ViewModelで扱うのは抵抗があります。そのため、View, ViewModelでは独自に定義した型に変換して使用したいです。

内容

データモデルは以下のように定義します。

# 独自の型
struct MyTask {
    let id: String
    let title: String
    let finished: Bool
}

# RealmのModel
final class ReMyTask: Object {
    @objc dynamic var id = UUID().uuidString
    @objc dynamic var title = ""
    @objc dynamic var finished = false

    override static func primaryKey() -> String? {
        return "id"
    }
}

以上のReMyTaskに変換する処理を追加します。

final class ReMyTask: Object {
    @objc dynamic var id = UUID().uuidString
    @objc dynamic var title = ""
    @objc dynamic var finished = false

    override static func primaryKey() -> String? {
        return "id"
    }

    var taskStruct: MyTask {
        get {
            return MyTask(id: self.id, title: self.title, finished: self.finished)
        }
    }
}

使い方は以下のように行います。

let realm = try! Realm()
let tasks = realm.objects(ReMyTask.self)

# MyTaskのstructで返却される
Array(tasks).map({ (data: ReMyTask) in data.taskStruct })

まとめ

実はこの記事を書いている日に初めてRealmを使い始めたので、アンチパターンであるなら申し訳ないです。ただ、RealmSwift.Resultsが広範囲で使われることで保守しずらくなりそうだなと感じたのでこのような記事にしました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1