【问题标题】:How can I simplify this code (conversion to NSDictionary)?如何简化此代码(转换为 NSDictionary)?
【发布时间】:2018-01-27 01:46:25
【问题描述】:

我想将回复转换为NSDictionary。响应是ALRegistrationResponse (https://github.com/AppLozic/Applozic-Chat-iOS-Framework/blob/master/Applozic/DomainClasses/ALRegistrationResponse.m) 的实现。

NSDictionary *_response = @
{
    @"message":[response message] != nil ? [response message] : [NSNull null],
    @"deviceKey":[response deviceKey] != nil ? [response deviceKey] : [NSNull null],
    @"userKey":[response userKey] != nil ? [response userKey] : [NSNull null],
    @"contactNumber":[response contactNumber] != nil ? [response contactNumber] : [NSNull null],
    @"lastSyncTime":[response lastSyncTime] != nil ? [response lastSyncTime] : [NSNull null],
    @"currentTimeStamp":[response currentTimeStamp] != nil ? [response currentTimeStamp] : [NSNull null],
    @"brokerURL":[response brokerURL] != nil ? [response brokerURL] : [NSNull null],
    @"imageLink":[response imageLink] != nil ? [response imageLink] : [NSNull null],
    @"statusMessage":[response statusMessage] != nil ? [response statusMessage] : [NSNull null],
    @"encryptionKey":[response encryptionKey] != nil ? [response encryptionKey] : [NSNull null],
    @"displayName":[response displayName] != nil ? [response displayName] : [NSNull null],
    @"notificationSoundFileName":[response notificationSoundFileName] != nil ? [response notificationSoundFileName] : [NSNull null]
};

【问题讨论】:

  • 感谢您的链接!对所有字段进行迭代怎么样?
  • 我不会推荐它,但是NSArray *keys = @[@"message", @"deviceKey", etc.]; NSMutableDictionary *_response = [NSMutableDictionary new]; for (NSString *aKey in keys){[_response setObject:[response valueForKeyPath:key]?:[NSNull null] forKey:key];}
  • 它的超类有一个 -dictionary() 函数。它可能会做你想做的事。我意识到这有点晚了。 NSCoding,不在上面,但可以/应该用于存储

标签: ios objective-c applozic


【解决方案1】:

以下语法至少更简洁:

NSDictionary *_response = @{
    @"message": [response message] ?: [NSNull null],
    @"deviceKey": [response deviceKey] ?: [NSNull null],
    @"userKey": [response userKey] ?: [NSNull null],
    @"contactNumber": [response contactNumber] ?: [NSNull null],
    @"lastSyncTime": [response lastSyncTime] ?: [NSNull null],
    @"currentTimeStamp": [response currentTimeStamp] ?: [NSNull null],
    @"brokerURL": [response brokerURL] ?: [NSNull null],
    @"imageLink": [response imageLink] ?: [NSNull null],
    @"statusMessage": [response statusMessage] ?: [NSNull null],
    @"encryptionKey": [response encryptionKey] ?: [NSNull null],
    @"displayName": [response displayName] ?: [NSNull null],
    @"notificationSoundFileName": [response notificationSoundFileName] ?: [NSNull null]
};

【讨论】:

    【解决方案2】:

    另一种可能性是将键用作选择器:

    NSArray *keys = @[@"message", @"deviceKey", @"userKey", @"contactNumber", @"lastSyncTime", @"currentTimeStamp", @"brokerURL", @"imageLink", @"statusMessage", @"encryptionKey", @"displayName", @"notificationSoundFileName"];
    NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
    for (NSString *key in keys) {
        SEL selector = NSSelectorFromString(key);
        [dict setObject:[response performSelector: selector] ?: [NSNull null] forKey:key];
    }
    

    【讨论】:

      【解决方案3】:

      创建一个检查 nil 的函数怎么样? 像这样的:

      NSDictionary *_response = @
      {
          @"message":checkForNil([response message])
      ],...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-19
        相关资源
        最近更新 更多