Object (Optional Any): 获取元素

Object (Optional Any): get elements

我正在尝试在我的应用程序中传递带有观察到的通知的信息。 做到这一点的标准方法是设置用户信息。但是,我要传递的数据是一个集合,而不是一个字典。

所以,我这样做:

NotificationCenter.default.post(name: MY_NOTIFICATION_NAME, object:self.productIds)

物品顺利到达,但现在我无法拿到它:

我在控制台中这样做:

po notification.object!
▿ 2 elements
 - 0 : ZTJ
 - 1 : ZTM

但是,当我尝试获取其中一个元素时,我得到了这个:

po notification.object![0]
error: <EXPR>:8:21: error: value of type 'Any' has no subscripts
notification.object![0]

我做错了什么?

通知的对象类型为 Any?

当您在控制台中 po 时,您要求它打印其描述,Any 可以做到。

当你要求它下标时,Any 不能那样做,因为没有在该类型上定义下标。您需要将其转换为预期的类型:

po (notification.object as? [String])?[0]

一般来说,最好尽快确定 Any 的类型。将 Any 想象成一个用来通过 post 发送东西的盒子。你做的第一件事就是打开它,看看里面有什么。

你知道 notification.object 是一个 Set,但编译器不知道,因为它被声明为 Any,这意味着它可以是任何东西,所以它不能找到它应该使用 object[0] 的哪个实现。

要读取此对象,您需要将其转换为集合。

if let mySet = notification.object as? Set<MyType> {
  // Do whatever
}

记住 object 属性 of Notification 是设计用来作为过滤器的,如果你在添加观察者时传递一个值,你只会得到与完全相同的对象一起发送的通知。

userInfo字典是为了发送相关信息,喜欢你的设置。在这种情况下,我会发送这样的字典:

NotificationCenter.default.post(name: MY_NOTIFICATION_NAME, object: nil, userInfo: ["products": productIds])