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