• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 如何覆盖 isEqual : for CLBeacon?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 07:23:46 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

背景

我有一个方法,由第 3 方库提供,它返回 CLBeacons 数组。

- (void)beaconManagerESTBeaconManager *)manager
      didRangeBeaconsNSArray *)beacons
             inRegionCLBeaconRegion *)region

定期调用此方法,并且该数组包含范围内的信标列表。数组中的对象没有被重用,每次都发送新的信标对象

我正在根据它们的接近程度将这些对象添加和删除到数组中。


问题

我怎样才能为 CLBeacon 实现 isEqual: 以便像 containsObject:removeObject: 这样的数组方法,等无需大量额外实现即可工作。

我不能子类化,因为 CLBeacon 是作为 CLBeacon 返回的,所以我不能将它转换为我的自定义类。

我无法编写类别,因为在运行时调用的 isEqual: 是未定义的。

If the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime. This is less likely to be an issue if you’re using categories with your own classes, but can cause problems when using categories to add methods to standard Cocoa or Cocoa Touch classes.

[Source]

我真的不想诉诸方法混搭。



Best Answer-推荐答案


创建一个全局函数 beaconsAreEqual,它接受 2 个 CLBeacon 作为输入并返回一个 bool 值。

或者您是否特别需要定义 isEqual 方法?如果是这样,您可能必须使用方法调配。

编辑:

或者,您可以创建一个自定义的 CLBeacon 子类,它覆盖 isEqual(如果您想使用 NSArray 方法 contains,可能还有哈希)

然后为您的类创建一个自定义初始化程序,该初始化程序将常规 CLBeacon 作为输入并复制相关信息(您只需要 UUID、主要和次要版本号。)

完成此操作后,您可以获取来自位置管理器的信标,将它们转换为您的自定义类,并将 THOSE 保存到您的数组中,并将它们用于您的 contains 检查。

编辑#2:

另一种选择是使用 NSArray 方法 indexOfObjectPassingTest 代替。该方法将 block 作为参数,并返回整数索引,如果找不到对象,则返回 NSNotFound。

编辑#3:

看起来没有用于自己创建 CLBeacon 对象的初始化程序。您必须创建一个数据容器对象(NSObject 的子类)来保存来自 CLBeacon 的信息。这可以很好地检查信标是否已经在您的阵列中

关于ios - 如何覆盖 isEqual : for CLBeacon?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30460103/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap