将NS_OPTIONS枚举(UIRemoteNotificationType)位掩码转换为NSString分隔值

时间:2013-12-13 18:20:03

标签: ios objective-c enums nsstring

我想将UIRemoteNotificationType转换为字符串,以便在分析跟踪中使用。像“徽章:声音:警报”之类的东西。使用Xcode 5中提供的最新CLANG Objective-C语言功能,首选方法是什么?

我已经看到了许多其他关于使用各种技术进行单值NSEnum值的问题,特别是herehere。但是,这些都没有讨论包含多个位掩码值的基于NS_OPTION的枚举的解决方案。

我最初的想法是,我需要一个NSDictionary来映射值,NSArray在迭代后收集它们,有没有更优雅的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

这是我提出的解决方案,合理简洁,但仍然具体类型和未来扩展的脆弱性:

  

来自UIApplication.h typedef NS_OPTIONS(NSUInteger,UIRemoteNotificationType){       UIRemoteNotificationTypeNone = 0,       UIRemoteNotificationTypeBadge = 1<< 0,       UIRemoteNotificationTypeSound = 1<< 1,       UIRemoteNotificationTypeAlert = 1<< 2,       UIRemoteNotificationTypeNewsstandContentAvailability = 1<< 3,} NS_ENUM_AVAILABLE_IOS(3_0);

NSString* remoteNotificationTypesToString(UIRemoteNotificationType notificationTypes)
{
    NSArray *remoteNotificationTypeStrs = @[@"Badge", @"Sound", @"Alert", @"NewsStand"];
    NSMutableArray *enabledNotificationTypes = [[NSMutableArray alloc] init];

    #define kBitsUsedByUIRemoteNotificationType 4
    for (NSUInteger i=0; i < kBitsUsedByUIRemoteNotificationType; i++) {
        NSUInteger enumBitValueToCheck = 1 << i;
        if (notificationTypes & enumBitValueToCheck)
            [enabledNotificationTypes addObject:[remoteNotificationTypeStrs objectAtIndex:i]];
    }

    NSString *result = enabledNotificationTypes.count > 0 ?
                       [enabledNotificationTypes componentsJoinedByString:@":"] :
                       @"NotificationsDisabled";

    return result;
}

UIRemoteNotificationType notificationTypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
NSString *notificationTypesStr = remoteNotificationTypesToString(notificationTypes);
NSLog(@"Notification types: %@", notificationTypesStr);

答案 1 :(得分:0)

在优雅方面,我认为还没有一种方法可以在NS_ENUMNS_OPTIONS中获取选项的名称,因为它们只是底层C枚举的宏,而不是添加任何OOP细节。如果有一些NSEnum / NSOptions类包装器为底层枚举定义一个方法“getNames”来做你建议的事情会很好,但遗憾的是它还不存在。

所以,回到现实,NSDictionary方法肯定会有效,但是如何编写一个简单的辅助方法来执行一些按位操作并返回NSString?因此,如果您有一些代表您的位掩码的NSInteger,您可以编写如下方法:

- (NSString *)optionsToSerializedString:(NSInteger)options{
    NSString *str = @"";

    if (options & UIRemoteNotificationTypeBadge) {
        str = [str stringByAppendingString:@"badge:"];
    }
    if (options & UIRemoteNotificationTypeAlert) {
        str = [str stringByAppendingString:@"alert:"];
    }
    //etc. etc. for other cases

    return str;
}

请注意,这不会完全符合您在问题中的格式(“badge:sound:alert”),但我会留给您!