UKey's Labo

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′]