web-dev-qa-db-ja.com

iOS:なぜnilをNSDictionary値に設定できないのですか?

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

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"];
43
applefreak

実際のオブジェクトが必要です... NSNull を使用します

[NSNull null];
64
tybro0103

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

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

setValue:forKey:

指定されたキーと値のペアを辞書に追加します。

...
Discussion

このメソッドは、値がnilでない限り、setObject:forKey:を使用して値とキーを辞書に追加します。その場合、メソッドはremoveObjectForKey:を使用してキーを削除しようとします。

後で objectForKey: を使用してオブジェクトを取得して、nilに設定して削除したキーに対して取得すると、nilが返されます(引用以下のドキュメント)。

戻り値:

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

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

49

この方法で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"];
4
SamSol

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

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

パラメータ(Apple doc's)に従って:

anObject

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

aKey

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

1
Avi Levin

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

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

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

ちょうど使用を確認するには

 if([dict objectforKey:@ "text"]!= nil){} //これは、デフォルト値がnil 
 self 
であるため機能します
0
Kunal Balani