我的班级中有一个包含Ingredient对象的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;
}
答案 0 :(得分:0)
更改
if ([ingredient->name isEqualToString:ingredientName])
到
if ([ingredient.name isEqualToString:ingredientName])
答案 1 :(得分:0)
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
,但我个人更喜欢前者,因为后者也用于访问“便宜”的结构成员,而总是访问一个属性涉及方法调用,因此“更昂贵”。但那只是品味问题。