47

これは非常に基本的な質問かもしれませんが、NSDictionary 値として nil を割り当てられないのはなぜでしょうか? コードの多くの場所に次のステートメントがあります。nil の場合[q objectForKey:@"text"]、アプリはクラッシュしています。

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2];
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];

辞書に割り当てる前に、どこでも nil をチェックする必要があります。これが唯一の正しい方法ですか?明らかな何かが欠けていますか?

if([q objectForKey:@"text"] != nil)
    [dict setObject:[q objectForKey:@"text"] forKey:@"text"];
else
    [dict setObject:@"" forKey:@"text"];
4

5 に答える 5

70

実際のオブジェクトが必要です... NSNullを使用してください

[NSNull null];
于 2012-08-17T15:09:07.290 に答える
51

を使用して nil 値を設定できますがsetValue:forKey、キーが削除されます。

キーを に設定できるようにしたい場合は、キーを に設定するとキーが削除される をnil使用できます(以下のドキュメントからの引用)。オブジェクトの代わりにに注意してください。setValue:forKey:nil

setValue:forKey:

指定されたキーと値のペアをディクショナリに追加します。

...
討論

このメソッドは、 を使用して値とキーをディクショナリに追加しますsetObject:forKey:。ただし、値nilの場合は、メソッドは代わりに を使用してキーを削除しようとしますremoveObjectForKey:

objectForKey:後で設定して削除したキーを使用してオブジェクトを取得しようとするnilと、元にnil戻ります(以下のドキュメントからの引用)。

戻り値:

aKey に関連付けられた値。aKey に値が関連付けられていない場合は nil。

注: キーは実際には辞書に存在しないため、 を使用して取得することはできませんallKeys。または上に列挙されます。

于 2012-08-17T15:12:36.420 に答える
5

次の方法で nil オブジェクトを設定できます。

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

dictionary[@“key”] = nil;

あなたはそれに気づきましたか?

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

/* this statement is safe to execute    */

dictionary[@“key”] = nil;

/* but this statement will crash application    */

[dictionary setObject:nil forKey:@"key"];
于 2016-01-05T10:46:20.343 に答える
1

この方法を使用する場合:

func setObject(_ anObject: Any, forKey aKey: NSCopying)

パラメーター ( Apple doc によると):

anObject :

anObject が nil の場合、invalidArgumentException を発生させます。辞書で nil 値を表す必要がある場合は、 NSNull を使用します。

かぎ

aKey が nil の場合、invalidArgumentException を発生させます。

于 2017-09-25T07:10:51.923 に答える
0

私の友人がマーカーとして nil を使用しているのは、プログラミングが悪い兆候です。nil は、別の目的のために予約されています。

if([q objectForKey:@"テキスト"] != nil)
    [dict setObject:[q objectForKey:@"text"] forKey:@"text"];
そうしないと
    [dict removeObjectforKey:@"text"]; // key が存在しない場合、これは何もしません。

//デフォルトでは、すべてのキーの値は nil であり、この動作をオーバーライドしようとしています。言語規則に反することは、常に問題を引き起こします。

使用するだけで確認する

if([dict objectforKey:@"text"] !=nil){} // デフォルト値が nil であるため、これは機能します
自体
于 2012-08-17T15:15:48.530 に答える