web-dev-qa-db-ja.com

BOOLを挿入するObjective-C辞書

OK、私は少し混乱しています。たぶん些細なことでしょう。

次のような関数があります。

- (void)getNumbersForNews:(BOOL)news andMails:(BOOL)mails {
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setValue:news  forKey:@"getNews"];
[parameters setValue:mails forKey:@"getMails"];...}

setValue:forKey:を使用するかsetObject:ForKey:を使用するかは関係ありません。常に警告が表示されます。

「setの引数1を渡すと、キャストなしで整数からポインターが作成されます」...

一体どのように辞書にboolを挿入しますか?

62
Infinite

NSDictionaryの値はオブジェクトでなければなりません。この問題を解決するには、ブール値をNSNumberオブジェクトでラップします。

[parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"];
[parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"];
124
Steve Harrison

Objective-CコンテナはObjective-Cオブジェクトのみを保存できるため、オブジェクトをBOOLでラップする必要があります。 [NSNumber numberWithBool]でNSNumberオブジェクトを作成し、結果を保存できます。
後で、NSNumberの-boolValueを使用してブール値を取得できます。

14
Vladimir

BOOLはオブジェクトではありません。これはintの同義語であり、値として0または1を持ちます。その結果、オブジェクトを含む構造には配置されません。

NSNumberを使用して、任意の整数型のオブジェクトラッパーを作成できます。オブジェクトを取得するために呼び出すことができるコンストラクタ[NSNumber numberWithBool:]があり、それを使用します。同様に、それを使用してオブジェクトを再度取得することができます:[obj boolValue]

8
AlBlue

参考のための最新のコード:

parameters[@"getNews"] = @(news);
8
Hatchmaster J

@"YES"または@"NO"文字列オブジェクトを挿入でき、Cocoaはそれらを読み戻すとブール値にキャストします。

それ以外の場合は、dictionaryWithObjectsAndKeys:などのファクトリメソッドを使用して辞書を作成することをお勧めします。

6
Eimantas

@Steve Harrisonの回答を見ると、コメントが1つあります。何らかの理由で、これは、例えば.

 [parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"];

これにより、パラメータnewsNSDictionaryキーがnullに設定されます(何らかの理由で、実際には理由を理解できません)

私の唯一の解決策は、@ Eimantasの方法を次のように使用することでした。

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"];

これは完璧に機能しました。 BOOLを直接渡してもうまくいかない理由を聞かないでください。しかし、少なくとも解決策は見つかりました。何か案は?

2
pechar