使用 Nil 更新 Realm 对象不起作用

Updating Realm object with Nil not working

如何用 nil 更新 Realm 对象?用户删除图片后图片恢复,用Swift5保存在app上。当我尝试将 'nil' 直接设置为 Realm 对象以进行调试时,对象值没有改变。

realm.beginWrite()
let m = realm.objects(Inventory.self).filter("id == %@", detailId as Any).first
m!.image = nil
try! realm.commitWrite()

// Inventory.swift

class Inventory: Object {
@objc dynamic var number: Int = 1

//ID
@objc dynamic var id = 0

//Image
@objc dynamic private var imageData: Data? = nil 
dynamic private var _image: UIImage? = nil  

dynamic var image: UIImage? {
    set{
        self._image = newValue
        if let value = newValue {
            self.imageData = value.pngData() as Data?
        }
    }
    get{
        if let image = self._image {
            return image
        }
        if let data = self.imageData {
            self._image = UIImage(data: data as Data)
            return self._image
        }
        return nil
    }
} }

问题中代码的问题是如何将 Inventory 对象图像 属性 设置为 nil。

发生这种情况时

m!.image = nil

它正在将非托管 image 属性 设置为 nil

set {
   self._image = newValue
   if let value = newValue {
      self.imageData = value.pngData() as Data?
   }
}

但是正如您在 set 中的 if 语句中看到的那样,如果值为 nil,它将被忽略,因此 self.imageData 永远不会设置为 nil

有很多解决方案,但由于所有这些变量都是可选的,可能最简单的就是让它在集合中为 nil

set {
   self._image = newValue
   self.imageData = newValue.pngData() as Data?
}

编辑

以下是原始答案,但添加了更多数据后问题仍未完成。

只能将可选属性设置为 nil。所以它们需要在领域中以特殊的方式定义,就像这样对于 String 对象

class Inventory: Object {
   @objc dynamic var id = ""
   @objc dynamic var imageName: String? = nil  //or NSData/Data
   //or for numbers, use this let value = RealmOptional<Int>()
   ...

然后将可选项设置为 nil,这是一种安全的方法

let detailId = "some detail id"
if let item = realm.objects(Inventory.self).filter("id == %@", detailId).first {
    try! realm.write {
        item.imageName = nil
    }
} else {
  print("item not found")
}