【问题标题】:Can't add method, via Swift extension, to objective-c NSManagedObject Subclass无法通过 Swift 扩展向objective-c NSManagedObject 子类添加方法
【发布时间】: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 下进行检查,我的目标的复选框未被选中。但是我也查不出来。我必须做什么才能检查它?
  • 这很奇怪。您是如何将文件添加到项目中的?文件名是什么?

标签: objective-c swift


【解决方案1】:

正如 Martin R 指出的那样;我的 Swift 文件没有连接到我的目标。用一个新文件替换了我的 Swift 文件,它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2017-01-11
    • 1970-01-01
    相关资源
    最近更新 更多