NSManagedObject 不能符合 Swift 中的协议

Posted

技术标签:

【中文标题】NSManagedObject 不能符合 Swift 中的协议【英文标题】:NSManagedObject Can't conform to protocol in Swift 【发布时间】:2014-11-29 15:12:31 【问题描述】:

我需要一个 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”,引用自: __TFC11YellowPages5Stockm2spSS in Stock.o “__TFC11YellowPages5Stockg4codeSS”,引用自: __TFC11YellowPages5Stockm4codeSS in Stock.o ld:未找到体系结构 i386 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

【问题讨论】:

您是否尝试将@objc 添加到协议的开头? 我刚试过这个,但还是不行。@DanielT。 【参考方案1】:

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

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"
    

【讨论】:

非常感谢。当我将扩展和 NSManagedObject 类代码放在一个 swift 文件中时,它仍然显示相同的错误。但是如果我将扩展代码移动到另一个文件。它运行良好。所以奇怪 由于 CLLocationCoordinate2D,@objc 对我不起作用。起作用的只是将我的协议移动到通过 CoreData 自动生成的扩展类 - 在我将它放入类之前(这也是自动生成的) 当您尝试在协议中表达两个托管对象之间的关系时,这些方法存在问题。【参考方案2】:

斯威夫特

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

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

更多关于here

【讨论】:

以上是关于NSManagedObject 不能符合 Swift 中的协议的主要内容,如果未能解决你的问题,请参考以下文章

如何实现符合 Mappable 的 NSManagedObject 类

为啥我的 NSManagedObject 不符合 KVC?

创建 NSManagedObject 的副本

“filename+CoreDataProperties.swift”和“filename.swift”NSmanagedObject 子类有啥用?

来自 nsmanagedObject 的 NSJSONSerialization 表示键不符合键值编码

如何让我的简单对象符合 Swift 中的 NSManagedObject 和 NSCoding