NSPredicateに関するいくつかの問題があります。NSPredicateの作成
1.)私のコードは以下の通りです。
NSArray *arr= [self.humanArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY name IN %@ ", nameArray]];
以下の例外があります。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.'
*** Call stack at first throw:
私は述語を@"name IN %@ ", nameArray
と書く。それは動作しますが、私はそこにいくつかの欠陥があるかもしれないと思います。
注:humanArray
は、オブジェクトがHUMAN
であり、オブジェクトがhuman
で、次の属性を含んでいます。 name
,age
,gender
,country
,region
。
2.)私はここでやっていることは間違っていると思います。ユーザーには、self.humanArray
をフィルタリングするオプションが与えられます。ユーザーは、次の基準のうちの1つ以上を使用してフィルタリングすることができます。
name, age, gender, country or region.
私のコードは次のようになります。ユーザがすべてのフィルタ属性(region
、country
とname
)を選択した場合
NSArray *fRegionArray= [self.humanArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"regionIN %@ ", regionArray]];
NSArray *fCountryArray= [fRegionArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"country IN %@ ", countryArray]];
NSArray *fNameArray= [fCountryArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name IN %@ ", nameArray]];
このコードは、動作します。上記のコードを見ると、第1述語の出力配列が第2述語のフィルタリングに使用されていることがわかります。そういうわけで、それがこのように振舞う理由です。
私は上記のコードを変更する必要があります。そのため、ユーザーはフィルタリングの目的で任意の属性を入力します。 region
またはcountry
またはname
です。
質問1.上記の述語でINにANYを使用することはできませんか? ques 2.)私はそれを行う方法の例を教えてもらえますか? – Illep
for 1)ANYをスキップすると、そのように使われることはありません 2)変更可能な配列を作成し、各述語の結果からオブジェクトを追加してからremoveDuplicates –