OGeek|极客世界-中国程序员成长平台

标题: ios - 如何覆盖 isEqual : for CLBeacon? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 07:23
标题: ios - 如何覆盖 isEqual : for CLBeacon?

背景

我有一个方法,由第 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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4