简体   繁体   English

实现 KVO 投诉属性的协议扩展

[英]protocol extension implementing KVO complaint property

public class EntityA: NSManagedObject {
  @NSManaged public private(set) var identifier: String
  @NSManaged public private(set) var name: String
}

public class EntityB: NSManagedObject {
  @NSManaged public private(set) var identifier: String
  @NSManaged public private(set) var name: String
}

protocol NodeRepresentable {
    var children: NSArray { get }
    static var childrenKeyPaths: [String] { get }
}


extension NodeRepresentable where Self: NSManagedObject {
    var children: NSArray { //swift compiler doesn't see this as KVC complaint
        return Self.childrenKeyPaths.flatMap { keyPath in
            return self.mutableSetValueForKey(keyPath)
        }
    } 
}

extension EntityA: NodeRepresentable {
    static var childrenKeyPaths: [String] {
        return ["events", "groups", "races"]
    }

    var _children: NSArray { //this is KVC complaint
        return self.children
    }
}

extension EntityB: NodeRepresentable {

    static var childrenKeyPaths: [String] {
        return ["events", "groups", "markets"]
    }

    var _children: NSArray { //this is KVC complaint
        return self.children
    }
}

Compiler doesn't find valueForKey for children on EntityA and EntityB.编译器找不到 EntityA 和 EntityB 上的孩子的 valueForKey。 Protocol extensions don't seem to implement KVO complaint properties.协议扩展似乎没有实现 KVO 投诉属性。 I've tried declaring dynamic properties on protocol but that doesn't work.我试过在协议上声明动态属性,但这不起作用。

Is somehow possible to avoid declaring computed var on each Entity using some type of language feature?是否有可能避免使用某种类型的语言功能在每个实体上声明计算变量?

The Swift property extension aren't visible to Objective-C. Swift 属性扩展对 Objective-C 不可见。

Try adding @objc to the declaration.尝试将@objc添加到声明中。 ie @objc var children: ...@objc var children: ...

see also https://developer.apple.com/forums/thread/122181另见https://developer.apple.com/forums/thread/122181

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM