【问题标题】:Fast enumeration in OS 3.0OS 3.0 中的快速枚举
【发布时间】:2009-06-19 17:00:05
【问题描述】:

我刚刚尝试针对 OS 3.0 编译我的 iPhone 应用程序,但在使用快速枚举时出现编译错误。

我正在尝试通过包含 cComment 类的 NSArray:

for (cComment* newComment in comments.comments)

我得到了这个错误

错误:访问器的类型与属性“cmets”的类型不匹配。

这在使用 OS 2.2.1 编译时可以完美运行。

我理解错误,枚举不是强类型,但据我所知,objective-c 不支持泛型/模板。所以目前我只能看到一种解决方法:

for (id commentObject in comments.comments)
{
     cComment *newComment = (cComment *)commentObject;
}

谁能想到其他方法?为什么这发生了变化?任何关于此更改的苹果文档将不胜感激。

编辑

按照 Grouchal 的建议,我尝试了这个: NSArray* allComments = cmets.cmets 我得到了同样的错误,所以它似乎与枚举无关

这是头文件的代码:

NSMutableArray *cmets;

@property (readonly,nonatomic) NSArray* cmets;

并且属性在实现文件中合成。

将属性更改为 NSMutableArray 似乎可以解决问题,但我看不出有什么理由会出现这种情况。任何想法。

谢谢。

【问题讨论】:

    标签: iphone objective-c iphone-sdk-3.0


    【解决方案1】:

    问题出在属性定义中。您应该将其更改为:

    @property (readonly,nonatomic) NSMutableArray* comments

    不利的一面是,您的数组将被公开为可变的(尽管我想这是您想要防止的)。

    【讨论】:

    • 正是我想要阻止的,并且由于 NSMutableArray 是 NSArray 的子类,因此它确实应该像在 OS 2.2.1 中那样工作。不知道为什么这是 OS 3 的变化。
    • 如果不希望将 ivar 公开为可变的,您可以改为将 ivar 从 NSMutableArray* 更改为 id。这将使用动态(而不是静态)类型来引用“cmets”,这也应该消除编译问题。
    • 同意,真的不应该有任何改变,可变子类应该可以正常工作,尤其是对于可变子类。如果你可以在一小段代码中可靠地重现这一点,并证明它在 iPhone OS 3 中被破坏,你绝对应该提交一个错误:bugreport.apple.com
    • 谢谢奎恩。这绝对是可重现的,但我会在填写错误之前尝试查找有关该问题的更多信息。
    【解决方案2】:

    我看不出为什么这段代码不能在 OS 3.0 中运行,我已经有类似的代码在运行。

    如果你把代码改成

    NSArray *commentArray = comments.comments;
    for (cComment *newComment in commentArray){
    .....
    }
    

    我刚刚注意到,当我写这篇文章时,* 在您的代码中 - 这是问题所在吗? for 声明中真的应该是 cComment* 吗?

    【讨论】:

    • 我尝试了您的建议,似乎问题与枚举无关。 NSArray *commentArray = cmets.cmets 导致完全相同的错误我会用更多细节更新我的问题
    • NSFastEnumeration 足够聪明,只调用提供一次表达式的表达式并将其分配给自己的范围变量(对被调用者不可见),因此这样的分配将是多余的。
    【解决方案3】:

    我将结束这个问题,并在 iPhone OS 3.0 的 Objective-c 更改下提出一个新问题。

    我自己实现了 getter 方法来返回一个 NSArray,它工作得很好。将属性更改为 NSMutableArray 也可以,但这确实不是我想要做的。

    我不知道为什么会发生这种变化。这是客观 c 更改,而不是操作系统更改。在 2.2 API 3.0 API 之间的更改文档中也没有提及它。

    感谢大家的回复。

    【讨论】:

    • 可能只是因为某种原因编译器更严格。 (无论如何,您使用的是哪个编译器?在较新版本的 Xcode 中,您可以选择。)您不必关闭这个问题——您(或我)可以用更合适的东西重新标记它。
    • 由于我对 Mac 开发和 Xcode 还很陌生,所以当您说哪个编译器时,我不确定您的意思。我正在使用 Xcode 主屏幕上的下拉框更改我的编译设置(也许这就是问题所在)。由于我也是该站点的新手,因此我也不确定处理问题的适当方法,但我确实提交了一个新问题。会应用你的建议。新问题 - stackoverflow.com/questions/1019365/…
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多