我有一个父类base
,它继承NSMangedObject
。 (base
类没有与之关联的实体。它仅包含公共(public)属性和方法)。我有多个子类,其中很少有关联的实体,并且很少只使用 base
类中的常用方法。很少有子类使用 Obj-c 语言,也很少使用 swift 语言,所有这些都扩展了 base
类。
我的base
是在obj c lang中。 child1
类位于 swift 中,当我初始化它并尝试访问其中的属性时,它会给出错误的访问错误。
然后我创建了空实体 test
并在 obj c 中创建了子类并在 child1
中继承,它给出了相同的错误,但是当我在 swift 中创建子类并继承时有效。
是否存在 obj c 中 NSMangedObject 的子类不能在 swift 中继承的限制?
编辑
代码-
Base.h文件
@interface Base : NSManagedObject
@property (nonatomic, retain) NSNumber *property1;
@property (nonatomic,strong) NSString *property2;
@end
Base.m文件
@implementation Base
@synthesize property1;
@synthesize property2;
@end
Child1.swift 文件
@objc class Child1: Base {
var list = Child2()
var array : [String] = []
@objc static let sharedInstance: Child1 = Child1()
@objc class func filterSharedInstance()-> Child1{
return Child1.sharedInstance;
}
@objc func loadData(_ completionBlock: CompletionBlock?) {
if array.contains("Test"){
return
}
// some code
}
}
在某些 obj c 类中
Child1 *instance = [Child1 sharedInstance];
[instance loadData:nil];
调用上述函数后,由于array
未初始化,if array.contains("Test"){
行出现错误EXC_BAD_ACCESS。
当对 Swift 中的基类进行同样的操作时,它可以工作。
最佳答案
根本问题是 Child1
继承自 NSManagedObject
,而您正在创建一个如下所示的实例:
@objc static let sharedInstance: Child1 = Child1()
在 Swift 或 Objective C 中,您无法像这样初始化托管对象,因为您没有调用 NSManagedObject
指定的初始值设定项。尽管应用程序可能不会立即崩溃,但您应该会收到有关此问题的错误消息。即使它没有崩溃,该对象也没有用,并且很快就会导致问题,就像您所看到的那样。有two designated initializers ,其中任何一个都是有效的。
创建托管对象的单例共享实例是一件非常不寻常的事情。在某些情况下这可能是有道理的,但我从未遇到过这种情况。
关于objective-c - 无法在swift中继承NSMangedObject类型的 objective-c 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47472471/