我想在通知中发送枚举作为对象:
enum RuleError:String {
case Create, Update, Delete
}
class myClass {
func foo() {
NSNotificationCenter.defaultCenter().postNotificationName("RuleFailNotification",
object: RuleError.Create)
}
}
不幸的是,由于枚举不匹配 AnyObject?
,因此无法正常工作。
知道如何规避这个问题吗?
答案 0 :(得分:7)
您正在使用的函数中的object
参数是发件人,发布通知的对象,而不是参数。查看文档here。
您应该将要发送的枚举值作为参数放在用户信息词典中,并使用以下方法:
func postNotificationName(_ aName: String,
object anObject: AnyObject?,
userInfo aUserInfo: [NSObject : AnyObject]?)
在你的情况下:
let userInfo = ["RuleError" : RuleError.Create.rawValue]
NSNotificationCenter.defaultCenter().postNotificationName("RuleFailNotification",
object: self,
userInfo:userInfo)
要处理通知,请先注册:
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "handleRuleFailNotification:",
name: "RuleFailNotification",
object: nil)
然后处理它:
func handleRuleFailNotification(notification: NSNotification) {
let userInfo = notification.userInfo
RuleError(rawValue: userInfo!["RuleError"] as! String)
}
答案 1 :(得分:2)
最简单的解决方案是发送原始值
RuleError.Create.rawValue
以后可以转换回枚举
RuleError(rawValue : "Create")
但object
参数不适合发送自定义数据。更好地使用userInfo
字典。
答案 2 :(得分:1)
您可以使用装箱通过NSNotification发送类似枚举的纯Swift类型。
final class Box<T>: NSObject {
let value: T
init(_ value: T) {
self.value = value
}
}
发布通知:
let userInfo = ["RuleError" : Box(RuleError.Create)]
NSNotificationCenter.defaultCenter().postNotificationName("RuleFailNotification",
object: self,
userInfo:userInfo)
在您的观察者中,该值可以检索为:
if let box = notification.userInfo?["RuleFailNotification"] as? Box<RuleError> {
let ruleError = box.value
}
即使使用相关值,您也可以发送Swift枚举。
答案 3 :(得分:0)
示例。斯威夫特3
1:创建通知名称
extension NSNotification.Name {
public static let NetworkReachabilityStatus: NSNotification.Name =
NSNotification.Name(rawValue: "NetworkReachabilityStatusChanged")
}
2:一些枚举
enum NetworkReachabilityStatus {
case connected
case notConnected
}
3:发布数据
NotificationCenter.default.post(name: Notification.Name.NetworkReachabilityStatus,
object:nil,
userInfo:[kNetworkRechabilityStatus: NetworkReachabilityStatus.notConnected])
4:观察
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(networkStatusChanged(_:)), name: Notification.Name.NetworkReachabilityStatus, object: nil)
}
func networkStatusChanged(_ notification: Notification) {
let status: NetworkReachabilityStatus = notification.userInfo?[kNetworkRechabilityStatus] as! NetworkReachabilityStatus
switch status {
case .connected:
break
case .notConnected:
break
}
}
并且不要忘记取消订阅通知:)