web-dev-qa-db-ja.com

NSDictionaryへのnilオブジェクトの挿入

オブジェクトの5つのプロパティのうち2つだけを必要とするAPIがあり、iPhoneアプリがオブジェクトをインスタンス化する必要がない場合、オブジェクトがparams NSDicitionaryで使用されると、アプリがクラッシュします。 NSDictionaryでは、nilに達すると終了したと見なされるため、nil値を割り当てることはできないと言われました。 Objective-cには、オブジェクトのnil以外のプロパティをNSDictionaryに吐き出す方法がありますか?

例:

[Drunk alloc] init];
drunk.started_drinking = [NSDate date];
drunk.stopped_drinking (we don't set this because he is still a drunk)
drunk.fat = YES;
drunk.dumb = YES;


parameters:@{

             @"auth_token" :token,
             @"name" : drunk.name, @"date_started" : drunk.started_drinking,
             @"date_stopped" : drunk.stopped_drinking, 
             @"prescribing_doctor" : drunk.fat,
             @"pharmacy" : drunk.dumb

            }

これは、stopped_drinkingプロパティに到達するとクラッシュします。これを処理する方法について何か提案はありますか?

24
jdog

少し長めですが、できます

static id ObjectOrNull(id object)
{
  return object ?: [NSNull null];
}

parameters:@{
  @"auth_token"         : ObjectOrNull(token),
  @"name"               : ObjectOrNull(drunk.name),
  @"date_started"       : ObjectOrNull(drunk.started_drinking),
  @"date_stopped"       : ObjectOrNull(drunk.stopped_drinking),
  @"prescribing_doctor" : ObjectOrNull(drunk.fat),
  @"pharmacy"           : ObjectOrNull(drunk.dumb),
}
60
Paul.s

nilをコレクション(辞書、配列、インデックスセットなど)に挿入することはできません。

ただし、[NSNull null]を挿入することはできます。これは 彼らが何のために作ったのか

ディクショナリへのオブジェクトの挿入は非常に簡単になります(プロパティがnilの場合は、代わりにNSNullを挿入します)。次に、辞書から物事を引き出すときに、NSNullはシングルトンであり、したがってすべてのNSNullが実際にあるため、クイックif(myReturnedObject == [NSNull null])は戻り値が有効かどうかを示します。同じオブジェクト。

編集:Paul.sには、 三項演算子の使用法 を備えた、ケースの挿入動作の優れた例があります。

もう一度編集:以下のコメントにもかかわらず、Appleドキュメントで実際に確認されています上記にリンクされているコレクションに追加されたときにNSNullがクラッシュしないこと。

6
CrimsonDiego