【问题标题】:Check for value in NSMutableArray检查 NSMutableArray 中的值
【发布时间】:2011-05-14 12:22:16
【问题描述】:

我的班级中有一个包含成分对象的 NSMutableArray。我想检查任何成分的 name 属性是否与字符串匹配,但我的语法不太正确。

我真的很想念 Linq 和预测。

-(BOOL) hasIngredient:(NSString *)ingredientName{
    for (Ingredient *ingredient in ingredients) {
        //if([ingredient isKindOfClass:[Ingredient class]]){
            if ([ingredient->name isEqualToString:ingredientName]) {
                return YES;
            }
        //}
    }
                 return NO;
}

【问题讨论】:

    标签: iphone cocoa-touch objective-c++ iso


    【解决方案1】:

    foo->bar 语法直接访问实例变量。你不应该那样做。访问属性的语法是:

    object.property
    

    或:

    [object property]
    

    访问属性始终是一个方法调用。如果您有一个属性foo 并执行@synthesize foo;,编译器会生成一个名为foosetFoo: 的方法(如果该属性不是只读的)。

    所以你应该有类似的东西:

    @property(nonatomic,readonly) NSString *name;
    

    如果您希望名称可更改,请将readonly 替换为copy(使用copy 而不是retain 的原因是因为您可以传递一个可变字符串,然后稍后修改该可变字符串,这将肯定会产生意想不到的结果;你可以通过复制来避免这种情况)。

    现在你的方法变成了:

    -(BOOL) hasIngredient:(NSString *)ingredientName{
        for (Ingredient *ingredient in ingredients) {
            if ([[ingredient name] isEqual:ingredientName]) {
                return YES;
            }
        }
        return NO;
    }
    

    你也可以在这里写[ingredient name]而不是ingredient.name,但我个人更喜欢前者,因为后者也用于访问“便宜”的结构成员,而访问属性总是涉及方法调用因此“更贵”。但这只是口味问题。

    【讨论】:

      【解决方案2】:

      改变

      if ([ingredient->name isEqualToString:ingredientName])

      if ([ingredient.name isEqualToString:ingredientName])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多