我想将userInfo数据从NSNotification转换为enum以在switch语句中使用。该通知来自预编译的c ++框架,其中一些头文件定义了te enum。
-(void)updateOTAStatus:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
otaUpgradeStatus status = (otaUpgradeStatus)userInfo[@"status"];
//...
}
枚举定义:
typedef NS_ENUM(NSUInteger, otaUpgradeStatus) {
none = 0,
started = 1,
inProgress = 2,
completed = 3,
failed = 4,
failedLowBattery = 5,
cancelled = 6,
timedout = 7,
forced = 8
};
调试时我得到了
Printing description of status:
(otaUpgradeStatus) status = 6178538944
当我在Swift中做同样的事情时,switch语句失败了:
let status = notification.userInfo?["status"] as? otaUpgradeStatus
我得到了正确的状态,并且switch语句按预期工作。
这里出了什么问题?
答案 0 :(得分:4)
NSDictionary
只能包含对象,即NSObject
的(子类)的实例。 Swift有一个机制来包装/解包一个值
透明的opaque _SwiftValue
实例。
但是为了与Objective-C的互操作性,您必须输入数字
将NSNumber
个实例作为Swift方面的用户信息字典,例如
let notification = Notification(name: ..., object: ...,
userInfo: ["status": NSNumber(value: otaUpgradeStatus.failed.rawValue)])
并在Objective-C端提取整数值,例如
NSDictionary *userInfo = notification.userInfo;
NSNumber *num = userInfo[@"status"];
otaUpgradeStatus status = num.unsignedIntegerValue;