これは非常に基本的な質問かもしれませんが、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"];
実際のオブジェクトが必要です... NSNull を使用します
[NSNull null];
setValue:forKey
を使用してnil値を設定できますが、キーは削除されます。キーをnil
に設定できるようにする場合は、 setValue:forKey:
を使用できます。これにより、nil
(引用符に設定するとキーが削除されます以下のドキュメントから)。 Objectの代わりにValueに注意してください。
setValue:forKey:
指定されたキーと値のペアを辞書に追加します。
Discussion...
このメソッドは、値が
nil
でない限り、setObject:forKey:
を使用して値とキーを辞書に追加します。その場合、メソッドはremoveObjectForKey:
を使用してキーを削除しようとします。
後で objectForKey:
を使用してオブジェクトを取得して、nil
に設定して削除したキーに対して取得すると、nil
が返されます(引用以下のドキュメント)。
戻り値:AKeyに関連付けられた値、またはaKeyに関連付けられた値がない場合はnil。
注:キーは実際には辞書に存在しないため、allKeys
を使用して取得することはできません。または列挙される
この方法で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"];
この方法を使用する場合:
func setObject(_ anObject: Any, forKey aKey: NSCopying)
パラメータ(Apple doc's)に従って:
anObject:
AnObjectがnilの場合、invalidArgumentExceptionを発生させます。辞書でnil値を表す必要がある場合は、NSNullを使用します。
aKey
AKeyがnilの場合、invalidArgumentExceptionを発生させます。
マーカーとして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 であるため機能します