LoginSignup
16
14

More than 5 years have passed since last update.

EnumでRealmのカラムをセイフティに扱う

Posted at

はじめに

私が思うSwiftの優れている点の1つはEnumだと思います。
そして、データベース界隈で今最も熱いのはRealm。

今回はその強力な2つのツールの複合技について書きたいと思います。
題して、「EnumでRealmのカラムをセイフティに扱う」です。

RealmでEnum?

具体例

早速ですが、コードを見ていただきましょう。

NohirapEntity.swift
import RealmSwift

enum NohirapType: String {
    case Nohirap1 = "Nohirap1"
    case Nohirap2 = "Nohirap2"
    case Nohirap3 = "Nohirap3"
}

class NohirapEntity: Object {
    dynamic var id = ""
    dynamic var text = ""
    dynamic private var type = ""

    var nohirapType: NohirapType? {
        get {
            return NohirapType(rawValue: type)
        }
        set {
            type = newValue?.rawValue ?? ""
        }
    }

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

これは何をしているのかというと、
Realmオブジェクトのtypeカラムを外部からはEnum(nohirapType)を介してでないとアクセスできないようにしています。

なんでそんなことするの?

Enum型の利点といえば、enumで定義されたもの以外の意図しない値を代入できないようにすることによって、セイフティなコーディングができることだと思います。
上記の例では、typeをEnum(nohirapType)を介してアクセスすることを強制することによって、NohirapType型の値しか代入できないようにしています。

もう1つライブラリを増やしてみた

Swift + Realmといえば……。
そう、ObjectMapperですね。
ObjectMapperを使った場合はどう書くかを以下に記載します。

NohirapEntity.swift
import RealmSwift
import ObjectMapper

enum NohirapType: String {
    case Nohirap1 = "Nohirap1"
    case Nohirap2 = "Nohirap2"
    case Nohirap3 = "Nohirap3"
}

class NohirapEntity: Object {
    dynamic var id = ""
    dynamic var text = ""
    dynamic private var type = ""

    var nohirapType: NohirapType? {
        get {
            return NohirapType(rawValue: type)
        }
        set {
            type = newValue?.rawValue ?? ""
        }
    }

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

    required convenience init?(_ map: Map) {
        self.init()
        mapping(map)
    }
}

// MARK: - ObjectMapper
extension NohirapEntity :Mappable {
    func mapping(map: Map) {
        id <- map["id"]
        text <- map["text"]
        var typeTmp = ""
        typeTmp <- map["type"]
        nohirapType = NohirapType(rawValue: typeTmp)
    }
}

現場ではSwift + Realm + ObjectMapperの組み合わせはわりと使うので、よくこんな感じになっています。

まとめ

今回のケースでもそうですが、
とにかく隙あらばしつこいくらいにEnumを活用していけば良いのではないかと思います。

16
14
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
16
14