背景

我有一个由第三方库提供的方法,该方法返回CLBeacons数组。

- (void)beaconManager:(ESTBeaconManager *)manager
      didRangeBeacons:(NSArray *)beacons
             inRegion:(CLBeaconRegion *)region

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

我要根据它们的接近度将这些对象添加到数组中并将其删除。



我如何实现isEqual:CLBeacon,这样像containsObject:removeObject:等的数组方法就可以工作,而无需进行很多额外的实现。

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

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

如果在一个类别中声明的方法的名称与原始类中的方法的名称相同,或者在同一类(甚至是 super class )的另一个类别中的方法的名称相同,则该行为在使用哪种方法实现时未定义运行。如果您在自己的类中使用类别,则不太可能出现问题,但是在使用类别向标准Cocoa或Cocoa Touch类中添加方法时,可能会引起问题。

[Source]

我真的不希望诉诸方法。

最佳答案

创建一个全局函数beaconsAreEqual,该函数将2个CLBeacons作为输入并返回bool。
还是您特别需要定义isEqual方法?如果是这样,您可能会使用旋转​​方法。
编辑:
或者,您可以创建一个覆盖了isEqual的CLBeacon的自定义子类(如果要使用NSArray方法contains,则可能是哈希)。
然后为您的类创建一个自定义初始化程序,该类将常规CLBeacon作为输入并复制相关信息(您只需要UUID,主要和次要版本号即可。)
完成此操作后,您可以使用位置管理器中提供的信标,将其转换为自定义类,然后将THOSE保存到数组中,并将其用于contains检查。
编辑#2:
另一种选择是使用NSArray方法indexOfObjectPassingTest代替。该方法将一个块作为参数,并返回一个整数索引,如果找不到该对象,则返回NSNotFound。
编辑#3:
似乎没有可以自己创建CLBeacon对象的初始化程序。您必须创建一个数据容器对象(NSObject的子类),以保存来自CLBeacon的信息。这对于检查信标是否已在阵列中就可以了

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

10-10 06:29