Objective-C では、使用している API の結果と plist を比較したいと考えています。レシピの材料を返す API を使用しています。これらの結果を、ユーザーにレシピ名とレシピの材料を示す表ビューに入れています。ユーザーが選択したレシピを選択すると、その特定のレシピの材料がすべて揃っているかどうかをユーザーに知らせる UIAlert が表示されます。API の成分は、Plist と比較されます。質問するだけでなく、より明確に説明できるように努めます。
2 に答える
よく理解できれば、ユーザーの冷蔵庫にある食材は plist ファイルから抽出されます。
plist を読み込んで NSDictionary に保存するのはとても簡単です。次に、プログラムによって返された成分と比較できます。
plistがプログラムによって生成された場合、プログラムで意味のあるものを比較できます。たとえば、オブジェクト「Ingredient」のインデックスです。そうでない場合、何を比較するかによっては、比較が弱い可能性があります。
レシピにある材料ごとに、ユーザーに属するこの同じ材料の数を確認できます。
必要な材料がすべて食器棚にあるかどうかを知りたいとします。YES または NO の結果が必要なだけです。したがって、データから 2 つの NSArrays (requiredIngredients と foodCupboard) を作成します。
- (BOOL) weHaveIngredients:(NSArray*)requiredIngredients inCupboard:(NSArray*)foodCupboard
{
BOOL result = YES;
For (id ingredient in requiredIngredients) {
if !(foodCupboard containsObject:ingredient) {
result = NO;
break;
}
}
return result;
}
これは、NSSets (一意のオブジェクトのコレクション) を使用する方が適切です。NSArray から NSSet を簡単に作成できます。
NSSet* set = [NSSet setWithArray:(NSArray*)array];
次に、次のことができます。
- (BOOL) weHaveIngredients:(NSSet*)requiredIngredients inCupboard:(NSSet*)foodCupboard
{
BOOL result = YES;
if (!requiredIngredients isSubsetOfSet:foodCupboard)
result = NO;
return result;
}
あなたはそれを次のように使うことができます
NSString* alertmessage = "Sorry we can't make a cake, not enough ingredients"
if ([self weHaveIngredients:recipeIngredients inCupboard:foodCupboard])
alertmessage = "Start baking"
UIAlertView *alert =
[[UIAlertView alloc] initWithTitle: @"Ingredients checked"
message: alertMessage
delegate: self
cancelButtonTitle: @"OK"
otherButtonTitles: nil];
[alert show];
もう 1 つの問題は、データを 2 つの配列の形式にすることです。配列をtableViewに入れているので、すでにAPIから配列を取得している必要があります。同様に、何らかの方法で plist を作成したに違いないため、(格納された?) plist から配列を取得する方法を知っていると思います。特定のデータ変換の問題がある場合は、より具体的な質問をすることをお勧めします。
これはどれも、各成分が十分にあるかどうかという問題に対処するものではありません.これを適切に行うには、何らかのデータベースが必要になります.