0

クラスに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;
}
4

2 に答える 2

0

変化する

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

if ([ingredient.name isEqualToString:ingredientName])
于 2011-05-14T12:37:16.023 に答える
0

構文はfoo->barインスタンス変数に直接アクセスします。あなたはそれをすべきではありません。プロパティにアクセスするための構文は次のとおりです。

object.property

また:

[object property]

プロパティへのアクセスは常にメソッド呼び出しです。プロパティがfooあり、do@synthesize foo;の場合、コンパイラはfooandという名前のメソッドを生成し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、後者は「安価」な構造体のメンバーへのアクセスにも使用されるため、個人的には前者の方が好きですが、プロパティへのアクセスには常にメソッド呼び出しが含まれるため、「より高価」です。しかし、それは好みの問題です。

于 2011-05-14T12:37:34.593 に答える