Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 观察NSManagedObject变量上的didSet_Ios_Swift_Core Data - Fatal编程技术网

Ios 观察NSManagedObject变量上的didSet

Ios 观察NSManagedObject变量上的didSet,ios,swift,core-data,Ios,Swift,Core Data,我有BaseMO核心数据实体: extension BaseMO { @NSManaged public var id: String @NSManaged public var mobileLocalId: String? @NSManaged public var pendingToSave: NSNumber? } 我想要实现的是@NSManaged的didSet var特性: extension BaseMO { @NSManaged public var

我有BaseMO核心数据实体:

extension BaseMO {

    @NSManaged public var id: String
    @NSManaged public var mobileLocalId: String?
    @NSManaged public var pendingToSave: NSNumber?

}
我想要实现的是@NSManaged的didSet var特性:

extension BaseMO {

@NSManaged public var id: String {
  didSet {
    if (self.id.contains("<x-coredata://")) {
      fatalError()
    }
  }

@NSManaged public var mobileLocalId: String?
@NSManaged public var pendingToSave: NSNumber?

}
扩展BaseMO{ @NSManaged公共变量id:String{ 迪塞特{
if(self.id.contains)(这可能是使用自定义访问器的好地方

在CoreData中,这可以通过使用原语(每个属性都有一个底层属性)来实现。只需确保始终在getter和setter中实现调用,如下所示,以保持键值观察正确触发

如果内存正常,CoreData编程指南过去会有更多关于这方面的详细信息,但是你可以参考苹果关于原语的文档以及上面链接的定制访问器的适当簿记,以了解更多信息

使用此选项,您的代码可以根据特定的用例进行调整,但最终会看起来像:

public class BaseMO: NSManagedObject {

    @NSManaged fileprivate var primitiveId: String

    @objc public var id: String {
        get {
            willAccessValue(forKey: #keyPath(BaseMO.id))
            let value = primitiveId
            didAccessValue(forKey: #keyPath(BaseMO.id))
            return value
        }
        set {
            if (newValue.contains("<x-coredata://")) {
                fatalError()
            }
            willChangeValue(forKey: #keyPath(BaseMO.id))
            primitiveId = newValue
            didChangeValue(forKey: #keyPath(BaseMO.id))
        }
    }
}

公共类BaseMO:NSManagedObject{
@NSManaged fileprivate var原语ID:字符串
@objc公共变量id:字符串{
得到{
willAccessValue(forKey:#keyPath(BaseMO.id))
让值=原语ID
didAccessValue(forKey:#keyPath(BaseMO.id))
返回值
}
设置{
if(newValue.contains)(“