1

I want to convert response to NSDictionary. Response is an implementation of 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]
};
  • https://stackoverflow.com/questions/8760561/is-this-ternary-conditional-correct-objective-c-syntax + https://stackoverflow.com/questions/6177719/testing-for-nil-in-objective-c-ifx-nil-vs-ifx ? – Larme Aug 18 '17 at 11:29
  • Thanks for links! How about iteration over all the fields? – Andriy Tsaryov Aug 18 '17 at 11:30
  • I wouldn't recommend it, but `NSArray *keys = @[@"message", @"deviceKey", etc.]; NSMutableDictionary *_response = [NSMutableDictionary new]; for (NSString *aKey in keys){[_response setObject:[response valueForKeyPath:key]?:[NSNull null] forKey:key];}` – Larme Aug 18 '17 at 11:34
  • Its superclass has a -dictionary() function. It might do what you wanted. I realize this is a bit late. NSCoding, isn't on it, but can/should for storing – Stephen J Jan 02 '20 at 21:01

3 Answers3

1

At least a bit cleaner is the following syntax:

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]
};
André Slotta
  • 13,774
  • 2
  • 22
  • 34
1

Another possibility would be to use the keys as selectors:

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];
}
Daniel
  • 20,420
  • 10
  • 92
  • 149
0

How about creating a function to check for nil? Something like this:

NSDictionary *_response = @
{
    @"message":checkForNil([response message])
],...
Akaino
  • 1,025
  • 6
  • 23