无法通过 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 子类添加方法的主要内容,如果未能解决你的问题,请参考以下文章

无法访问扩展 Objective-C 类的 Swift 类中的私有变量

学习Swift -- 拓展

从 Objective-C 访问 Swift 扩展

使用 Objective-C 类别扩展 Swift 类

在 Swift 中使用 Objective-C 扩展类

如何从 Swift 扩展访问 Objective-C 类的私有成员?