在ObjectiveN中,在NSNotification中从Userinfo转换NSEnum失败

时间:2018-01-25 15:20:55

标签: c++ objective-c swift enums

我想将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语句按预期工作。

这里出了什么问题?

1 个答案:

答案 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;