繁体   English   中英

NSManagedObject 不能符合 Swift 中的协议

[英]NSManagedObject Can't conform to protocol in Swift

我需要一个 NSManagedObject 和一个常规 NSObject 的共享接口。 在 Objective-c 中,我可以使用协议来实现这一点。 但是在 Swift 中,我收到了这个运行时错误。 任何解决方案? 提前致谢!

protocol Product { var code: String { get set } var sp: String { get set } }

class Stock: NSManagedObject, Product {

@NSManaged var code: String
@NSManaged var sp: String

}

错误:体系结构 i386 的未定义符号:“__TFC11YellowPages5Stockg2spSS”,引用自:Stock.o 中的 __TFC11YellowPages5Stockm2spSS “__TFC11YellowPages5Stockg4codeSS”,引用自:__TFC11YellowPages5Stockg4codeSS,引用自:__TFC11YellowPages5Stockg4codeSS 中的 iTFC11YellowPages5Stockg4codeSS 错误:找不到命令架构中的 iTFC11YellowPages5Stockm2spSS 错误:链接架构错误:__TFC11YellowPages5Stockm2spSS退出代码为 1(使用 -v 查看调用)

这对我有用。 自己尝试一下,看看它是否有效:

class MyEntity: NSManagedObject {

    @NSManaged var testAttribute: String
}

@objc
protocol MyProtocol {

    var testAttribute: String { get set }
}

extension MyEntity: MyProtocol { }

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let myContext = appDelegate.managedObjectContext!
        let entity: MyEntity = NSEntityDescription.insertNewObjectForEntityForName("MyEntity", inManagedObjectContext: myContext) as MyEntity
        foo(entity)
        println(entity.testAttribute)
    }

    func foo(var object: MyProtocol) {
        object.testAttribute = "bar"
    }
}

以下也有效,但我认为以上是更好的方法:

@objc
protocol MyProtocol {

    var testAttribute: String { get set }
}

class MyEntity: NSManagedObject, MyProtocol {

    @NSManaged var testAttribute: String
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let myContext = appDelegate.managedObjectContext!
        let entity: MyEntity = NSEntityDescription.insertNewObjectForEntityForName("MyEntity", inManagedObjectContext: myContext) as MyEntity
        foo(entity)
        println(entity.testAttribute)
    }

    func foo(var object: MyProtocol) {
        object.testAttribute = "bar"
    }
}

迅速

当您使用 dynamic 修饰符标记成员声明时,始终使用 Objective-C 运行时动态调度对该成员的访问。 对该成员的访问永远不会被编译器内联或去虚拟化。

class Stock: NSManagedObject, Product {
    @NSManaged dynamic var code: String
    @NSManaged dynamic var sp: String
}

更多关于这里

暂无
暂无

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

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