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 类
“filename+CoreDataProperties.swift”和“filename.swift”NSmanagedObject 子类有啥用?