Realmオブジェクトのクローン(オブジェクトのコピー)

Realmオブジェクトのクローンを作成する
画面に設定されているRealmオブジェクトの書き換えが必要になったので調べました。
一旦Realmに登録したオブジェクト or Realmから取得したオブジェクトは、
Realmの管理オブジェクトとなり、トランザクション外でオブジェクトを書き換えようとするとエラーが発生するためです。
動作環境
環境 | バージョン |
---|---|
Xcode | 9.4.1 |
iOS | 11.4 |
swift | 4.1.2 |
Realm | 3.1.1 |
NSCopingプロトコルを適用する
以下のようなRealmのEntityクラスがある場合。
import Foundation
import RealmSwift
class Item: Object {
// アイテムID
@objc dynamic var itemId: Int = 0
// アイテム名
@objc dynamic var itemName: String = ""
// メモ
@objc dynamic var memo: String = ""
override static func primaryKey() -> String? {
return "itemId"
}
}
EntityクラスにNSCopying
プロトコルを適用し、
copy(with zone: NSZone? = nil) -> Any
を実装します
class Item: Object, NSCopying {
// 略
// copyを実装する
func copy(with zone: NSZone? = nil) -> Any {
let copy: Item = Item()
copy.itemId = itemId
copy.itemName = itemName
copy.memo = memo
return copy as Any
}
}
実際にクローンを作成する場合は、以下のようにします。
// realmからオブジェクトを取得する
// selectByItemIdはご自分の環境下の状況に読み替えてください
let item: Item = itemIntractor.selectByItemId(itemId: self.itemId)
// クローンを作成する
let itemClone: Item = item.copy() as? Item
[amazon_link asins=’4774188484′ template=’custom’ store=’takayuki57101-22′ marketplace=’JP’ link_id=’8a71c8e4-a8e5-11e8-8172-f3bd32867a72′]