如何解决Realm对象观察者observe方法的泛型指定问题,避免类型强转
解决方法
你只需要显式声明闭包参数change的具体泛型类型,让编译器可以推断出observe方法的泛型T,就不需要手动强转了,示例代码如下:
let contactObserver: NotificationToken = contact.observe { (change: ObjectChange<Contact>) in switch change { case .change(let contact, _): // 此处contact已经自动为Contact类型,无需强转可直接访问属性方法 // 你的原有业务逻辑 case .deleted: // 处理对象被删除的场景 case .error(let error): // 处理监听报错场景 } }
原理解释
observe方法的泛型T没有强制显式声明的入口,是通过传入的回调闭包的参数类型自动推断的。你原来的写法没有指定change的类型,编译器默认会把T推断为约束的基类RLMObjectBase,所以.change关联的object是基类类型,需要你手动强转成子类Contact。ObjectChange<T>是Realm封装的对象变更状态枚举,泛型T对应你监听的Realm对象类型,当你显式指定T为Contact后,.changecase 关联的对象会自动匹配为Contact类型,完全省去类型校验和强转的步骤。
内容的提问来源于stack exchange,提问作者Murray Sagal
相关产品推荐
相关产品推荐

