Проверьте значение в NSMutableArray - PullRequest
0 голосов
/ 14 мая 2011

В моем классе есть NSMutableArray, содержащий объекты Ingredient.Я хочу проверить, соответствует ли свойство 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;
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2011

Синтаксис 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здесь, но мне лично больше нравится первый, так как последний также используется для доступа к членам структуры, которая является «дешевой», тогда как доступ к свойству всегда включает вызов метода и, следовательно, «более дорогой».Но это только вопрос вкуса.

0 голосов
/ 14 мая 2011

Изменить

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

на

if ([ingredient.name isEqualToString:ingredientName])
...