【问题标题】:NSManagedObject Can't conform to protocol in SwiftNSManagedObject 不能符合 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。

标签: ios swift


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2016-09-29
    相关资源
    最近更新 更多