【问题标题】: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;,编译器会生成一个名为foo 和setFoo: 的方法(如果该属性不是只读的)。
所以你应该有类似的东西:
@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])