属性类型与访问者类型不匹配

kyl*_*ejm 15 xcode objective-c ios xcode6 ios8

使用Xcode 6 Beta 4,针对iOS 8:

我一起使用Core Data和Mogenerator.如果您不熟悉"Mogen",请跳至最底层.当Mogen为实体生成NSManagedObject子类时,它会执行以下操作:

@interface MyEntityID : NSManagedObjectID {}
@end

@interface _MyEntity : NSManagedObject {}

- (MyEntityID*)objectID;

----------------------------------------------------------------------------

@implementation _MyEntity

- (KJMWorkoutID*)objectID {
    return (KJMWorkoutID*)[super objectID];
}
Run Code Online (Sandbox Code Playgroud)

我觉得这很方便.NSManagedObject有一个objectID属性,所有_MyEntity正在做的是覆盖它的getter来返回一个MyEntityID,以便我们可以告诉它是一个专门用于我们的_MyEntityClass的ID.

所以,回到我的问题.我想通过检查它们不相等来比较两个MyEntityID:

if (![self.objectID isEqual:self.previousID])
Run Code Online (Sandbox Code Playgroud)

我收到这个警告:

Type of property 'objectID' does not match type of accessor 'objectID'

好的,我知道该属性是NSManagedObjectID,但我们正在调用Mogen编写的访问器方法,该方法返回MyEnytityID.即使代码完成也能识别这一点.

它如何仍然看到NSManagedObject的objectID的NSManagedObjectID属性类型?我应该以某种方式沉默警告吗?它可能只是一个Xcode 6 Beta的东西吗?(它不会发生在Xcode 5中)

什么是摩根:

Mogen只是一个有用的工具,可以为您的数据模型实体生成NSManagedObject的子类.它有点像Xcode所做的那样,但是不会删除你每次重新生成子类时编写的任何自定义代码,它会为你提供一大堆很好的方法来创建新的实体等.如果下栏有前缀类名字的东西你也有新的东西,它只是Mogen停止覆盖你写的任何自定义代码的方式.

Mar*_*n R 38

这个问题与Xcode 6 beta版本无关,但由于objectIDiOS 8中声明已更改,直到iOS 7,它被声明为 实例方法:

- (NSManagedObjectID *)objectID;
Run Code Online (Sandbox Code Playgroud)

从iOS 8/OS X 10.10开始,它被声明为只读属性:

@property (nonatomic, readonly, strong) NSManagedObjectID *objectID;
Run Code Online (Sandbox Code Playgroud)

/sf/answers/496028361/中所述,您可以使用具有更专业化返回值的方法覆盖子类中的实例方法,在这种情况下

- (MyEntityID *)objectID;
Run Code Online (Sandbox Code Playgroud)

但是使用更专业的返回值覆盖属性似乎是有问题的(这样做会导致与Xcode 5相同的警告).

以下似乎适用于"旧"和"新"SDK:在"_MyEntity.h"中,替换

- (MyEntityID*)objectID;
Run Code Online (Sandbox Code Playgroud)

通过

@property (nonatomic, readonly, strong) MyEntityID *objectID;
Run Code Online (Sandbox Code Playgroud)

并在"_MyEntity.m"中,删除- (MyEntityID*)objectID方法并添加

@dynamic objectID;
Run Code Online (Sandbox Code Playgroud)

但是,这些文件总是由Mogenerator重新创建,因此这不是一个令人满意的解决方案.我建议向Mogenerator人员提交错误报告,以找到与iOS 8/OS X 10.10 SDK兼容的解决方案.

我找不到编译器选项来抑制此警告(它没有标记为"-W ...",因此"-Wno ..."选项会禁止它.

作为解决方法,您可以替换self.objectID[self objectID],这不会导致警告.