2011-05-14 50 views
0

我在包含Ingredient對象的類中有一個NSMutableArray。我想檢查名稱屬性中的任何成分是否與字符串匹配,但我無法使語法正確。檢查NSMutableArray中的值

我真的失蹤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

foo->bar語法直接訪問實例變量。你不應該那樣做。訪問屬性的語法是:

object.property 

或:

[object property] 

訪問屬性始終是一個方法調用。如果您有一個屬性foo@synthesize foo;,則編譯器會生成一個名爲foosetFoo:(如果該屬性不是隻讀)的方法。

所以,你應該是這樣的:

@property(nonatomic,readonly) NSString *name; 

,如果你想要的名稱爲可更改(使用copy代替retain是因爲你可以通過一個可變的字符串,然後後來的原因與copy更換readonly修改該可變字符串,這將確保產生意想不到的結果;您通過複製避免了這種情況)。

現在,你的方法就變成了:

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

[ingredient name]相反,你也可以寫ingredient.name這裏,但我個人比較喜歡前者更好,因爲後者也被用於訪問一個結構是「廉價」的成員而訪問屬性總是涉及方法調用,因此「更昂貴」。但這只是一個品味問題。

0

變化

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

if ([ingredient.name isEqualToString:ingredientName])