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],这不会导致警告.