无法通过 Swift 扩展向objective-c NSManagedObject 子类添加方法
Posted
技术标签:
【中文标题】无法通过 Swift 扩展向objective-c NSManagedObject 子类添加方法【英文标题】:Can't add method, via Swift extension, to objective-c NSManagedObject Subclass 【发布时间】:2015-12-13 19:53:46 【问题描述】:Xcode 7.2 中 NSManagedObject 子类的代码生成器与 Objective-C 的代码生成器不匹配。 (对多关系没有访问器方法。)
所以我想这样做:
在 Objective-C 中生成 NSManagedObject 子类。 创建桥接头文件。 为生成的 Objective-C 类编写 Swift 扩展。 在 Swift 中使用扩展的 Objective-C 类。我执行了上面的步骤,但是当我尝试调用下面的代码时,我得到了一个Person类型的值,没有成员syHello错误。
目标-C:
@interface Person (CoreDataProperties)
@property (nullable, nonatomic, retain) NSString *name;
@property (nullable, nonatomic, retain) NSSet<Pet *> *pets;
@end
@interface Person (CoreDataGeneratedAccessors)
- (void)addPetsObject:(Pet *)value;
- (void)removePetsObject:(Pet *)value;
- (void)addPets:(NSSet<Pet *> *)values;
- (void)removePets:(NSSet<Pet *> *)values;
@end
斯威夫特:
public extension Person
public func sayHello()
print("Hello! My name is \(self.name).")
斯威夫特:
let myPerson = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: myAppDelegate.managedObjectContext) as! Person
myPerson.sayHello()
编译器需要做什么才能在我的 Person 类上获取我的扩展,以便我可以在其上调用 sayHello?
【问题讨论】:
应该可以。是否在桥接头文件中同时导入“Person.h”和“Pet.h”? 是的!这是我的桥接头文件的内容。 #import "Person+CoreDataProperties.h" #import "Person.h" #import "Pet+CoreDataProperties.h" #import "Pet.h" 是否为带有扩展名的 Swift 文件选中了“Target Membership”复选框? 如果我在文件检查器的 Target Membership 下进行检查,我的目标的复选框未被选中。但是我也查不出来。我必须做什么才能检查它? 这很奇怪。您是如何将文件添加到项目中的?文件名是什么? 【参考方案1】:正如 Martin R 指出的那样;我的 Swift 文件没有连接到我的目标。用一个新文件替换了我的 Swift 文件,它工作正常。
【讨论】:
以上是关于无法通过 Swift 扩展向objective-c NSManagedObject 子类添加方法的主要内容,如果未能解决你的问题,请参考以下文章