我想将UIRemoteNotificationType转换为字符串,以便在分析跟踪中使用。像“徽章:声音:警报”之类的东西。使用Xcode 5中提供的最新CLANG Objective-C语言功能,首选方法是什么?
我已经看到了许多其他关于使用各种技术进行单值NSEnum值的问题,特别是here和here。但是,这些都没有讨论包含多个位掩码值的基于NS_OPTION的枚举的解决方案。
我最初的想法是,我需要一个NSDictionary来映射值,NSArray在迭代后收集它们,有没有更优雅的方法来解决这个问题?
答案 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_ENUM
或NS_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”),但我会留给您!