【问题标题】:Type of property does not match type of accessor属性类型与访问器类型不匹配
【发布时间】:2014-09-18 06:58:45
【问题描述】:

使用 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];
}

我想这很方便。 NSManagedObject 有一个 objectID 属性,_MyEntity 所做的只是覆盖它的 getter 以返回一个 MyEntityID,以便我们可以知道它是一个专门用于我们的 _MyEntityClass 的 ID。

那么,回到我的问题。我想通过检查它们是否不相等来比较两个 MyEntityID:

if (![self.objectID isEqual:self.previousID])

我收到此警告:

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 阻止自己覆盖你编写的任何自定义代码的方式。

【问题讨论】:

    标签: ios objective-c xcode ios8 xcode6


    【解决方案1】:

    @Martin R 的回答是正确的,但是对于那些从现在开始到这里的人来说,Mogenerator 已经更新为v1.28 并修复了这个问题。

    【讨论】:

    • 感谢您更清楚地说明 Mogen 已更新 :)。我在对@Marin R 的回答的评论中提到了它,但您必须单击 show cmets 才能看到它。
    【解决方案2】:

    这个问题与 Xcode 6 beta 版本无关,但由于 objectID 的声明在 iOS 8 中发生了变化。直到 iOS 7,它被声明为 实例方法

    - (NSManagedObjectID *)objectID;
    

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

    @property (nonatomic, readonly, strong) NSManagedObjectID *objectID;
    

    https://stackoverflow.com/a/7086119/1187415 中所述,您可以覆盖 子类中的实例方法,其方法具有更专业的返回值, 在这种情况下

    - (MyEntityID *)objectID;
    

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

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

    - (MyEntityID*)objectID;
    

    通过

    @property (nonatomic, readonly, strong) MyEntityID *objectID;
    

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

    @dynamic objectID;
    

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

    我找不到抑制此警告的编译器选项(它没有标记为 "-W..." 这样 "-Wno..." 选项就会抑制它。

    作为一种解决方法,您可以将self.objectID 替换为[self objectID],这样可以 不会引起警告。

    【讨论】:

    • 很棒的答案,谢谢!您链接到的其他答案也非常好。
    • 此警告是否有 Clang 覆盖?我们(目前)有很多这样的
    • @itsthejb:好问题。似乎没有“-Wno...”编译器选项来抑制警告。
    • 确实如此。通常 Clang 警告会发出适当的警告标志。多么烦人!我们有太多的这些无法使用 Clang 诊断
    • @itsthejb 如果你像我一样使用 Mogen 并面临这个问题,有人修复了它:github.com/rentzsch/mogenerator/pull/201。只需克隆 repo 并构建,快乐的日子!
    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多