为啥我不能在通知中将数组转换为 AnyObject?

Posted

技术标签:

【中文标题】为啥我不能在通知中将数组转换为 AnyObject?【英文标题】:Why can't I cast an array to AnyObject in a notification?为什么我不能在通知中将数组转换为 AnyObject? 【发布时间】:2016-06-13 08:58:14 【问题描述】:

我有一个 RequestError 数组,我想将它传递给通知 userInfo 对象。

let errors: [RequestError]
let errorDictionary = ["errors": errors]
NSNotificationCenter.defaultCenter().notificationCenter.postNotificationName(UserSaveFailKey, object: self, userInfo: errorDictionary)

我为什么会得到

无法将“[String : [RequestError]]”类型的值转换为预期值 参数类型 '[NSObject : AnyObject]?'

【问题讨论】:

我怀疑你的问题是RequestErrorstructstruct 的数组不能转换为 NSArray,因此它不能是 AnyObject 如果RequestError 也是enum 也不起作用。它必须是引用类型,即class 【参考方案1】:

如果RequestErrorenumstruct,则它不是引用类型,并且它们的数组将不符合AnyObject,因为它无法转换为NSArray

你可以通过创建一个包装类来解决这个问题:

class RequestErrorsWrapper 
    let errors: [RequestError]

    init(errors: [RequestError]) 
        self.errors = errors
    


let errorDictionary = ["errors": RequestErrorsWrapper(errors: errors)]
NSNotificationCenter.defaultCenter().postNotificationName(UserSaveFailKey, object: self, userInfo: errorDictionary)

然后在接收端,你会像这样解压错误:

    if let wrapper = notification.userInfo?["errors"] as? RequestErrorsWrapper 
        let errors = wrapper.errors
        // use errors
    

【讨论】:

以上是关于为啥我不能在通知中将数组转换为 AnyObject?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 2.3 中将 UInt8 转换为 Anyobject

为啥我不能在此代码中将 A* 转换为 B*?

为啥我不能在 .net 核心中将静态属性与通知绑定?

将 json 数据转换为 [[String: AnyObject]] 后,它似乎是空的 - 为啥?

为啥不能使用 SqlFunctions 在 LinQ 中将 int 转换为字符串?

如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?