2016-12-20 5 views
-1

NSMutableArrayから不明な型を削除しようとすると、削除する変数に項目を割り当てる方法がわかりません。私はその型の文字列プロパティをドリルダウンすることはできますが、オブジェクト全体を削除する方法は不明です。NSMutableArrayから不明な型を削除する

今私が取得していますエラーは次のとおりです。宣言されていない識別子「アイテム」

NSMutableArray * skProducts = response.products; 
for (SKProduct * skProduct in skProducts) { 
    NSLog(@"Found product: %@ %@ %0.2f", 
      skProduct.productIdentifier, 
      skProduct.localizedTitle, 
      skProduct.price.floatValue); 


    if ([skProduct.productIdentifier isEqualToString:@"com.eboticon.Eboticon.baepack1"]) { 
     // do found 
     [skProducts removeObject: item]; 
    } else { 
     // do not found 
    } 
+1

コピー&異なるソースから貼り付けるのですか? – vikingosegundo

+0

@vikingosegundo私はstackoverflowから行いましたが、ここではステートメントの一部を変数に代入して削除できるように変数を割り当てることができません。 –

+1

投稿されたコードに 'item'とは何ですか? – rmaddy

答えて

3

使用あなたの現在の問題は、あなたがitemを定義しないこと、です。

あなたは(fast) enumeratingfor (SKProduct * skProduct in skProducts) {です。itemの代わりにskProductと表示されている可能性があります。

新しいエラーが表示されたら、配列を列挙している間に配列を変更することはできません。その解決策についてはBest way to remove from NSMutableArray while iterating?を参照してください。

片道:逆block-based enumeration

別の方法:望ましくない商品IDを持たないすべての商品をフィルタする。

[skProducts filterUsingPredicate:[NSPredicate predicateWithFormat:@"productIdentifier != %@", @"com.eboticon.Eboticon.baepack1"]]; 

別のノート:

私が想定し、responseがクラスSKProductsResponseであること。それはproductsプロパティは、あなただけの変数を入力しているとして、これは変数が指しているオブジェクトを変換しませんので、skProducts NSArrayのではなく、NSMutableArrayのを指しん

NSMutableArray * skProducts = response.products; 

@property(nonatomic, readonly) NSArray<SKProduct *> *products;として定義されます。

あなたは、あなたが列挙されている配列を変異(とために...構文が列挙さで)することができないのObjective-Cでは

NSMutableArray *skProducts = [response.products mutableCopy]; 
+1

"高速列挙"を使用している間は、アレイを変更することはできません。 "通常の" for "ループを使用すると、それを修正することができます。 – rmaddy

+1

@rmaddy、言い回しを修正しました。ありがとう。 – vikingosegundo

1

ような何かをしたいです。あなたはクラッシュするでしょう。

インデックスを逆順にオブジェクトをループし、属していないオブジェクトを削除するか、またはNSArrayファンクションfilterUsingPredicateを使用する必要があります。 filterUsingPredicateはおそらく良い方法ですが、私は頭の上からコードを分け与えるのに十分な頻度でNSPredicateを使用しません。

ループバージョンのため、次のようになります。あなたは

if (skProducts.count == 0) 
    return; 
for (NSInteger index = skProducts.count - 1; index >= 0; index--) { 
    product = skProducts[index]; 
    if ([skProduct.productIdentifier isEqualToString:@"com.eboticon.Eboticon.baepack1"]) { 
    //Do whatever you need to do with the object before removing it 
    [skProducts removeObjectAtIndex: index]; 
    } 
} 
+1

いくつかあります。 1) 'int'を使わないでください。ループには 'NSInteger'を使います。 2) 'count'が符号なしなので' skProducts.count - 1'を使うのは危険です。配列が空の場合、最初のインデックスは非常に大きな数値になり、そのインデックスのオブジェクトにアクセスしようとするとアプリケーションがクラッシュします。 – rmaddy

+0

良い点。 NSIntegerを使用しないように私の気が狂っていて、範囲チェックについて警告します。 –

+1

余分な 'if'チェックの代わりに、' 'for(NSInteger index = whatever.count; index> 0; index - )'を使うことです。 someArray [index-1] '。しかし、私のアプローチでは、ループ内の 'index'のすべての用途に対して' - 1'を思い出す必要があるため、 'if'チェックが安全かもしれません。 – rmaddy

関連する問題