24

オブジェクトのうち5つのプロパティのうち2つだけを必要とするAPIがあり、iPhoneアプリがオブジェクトをインスタンス化する必要がない場合、オブジェクトがパラメータ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プロパティに到達するとクラッシュします。これを処理する方法について何か提案はありますか?

4

2 に答える 2

61

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

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),
}
于 2012-12-10T23:17:25.390 に答える
7

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

[NSNull null]ただし、これが彼らの目的であるため、挿入することはできます

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

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

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

于 2012-12-10T23:17:03.877 に答える