はじめに
私が思う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を活用していけば良いのではないかと思います。