gpt4 book ai didi

ios - 如何覆盖 isEqual : for CLBeacon?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:17 26 4
gpt4 key购买 nike

背景

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

- (void)beaconManager:(ESTBeaconManager *)manager
didRangeBeacons:(NSArray *)beacons
inRegion:(CLBeaconRegion *)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]

我真的不想求助于方法调配。

最佳答案

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

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

编辑:

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

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

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

编辑#2:

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

编辑#3:

貌似没有自己创建CLBeacon对象的初始化器。您必须创建一个数据容器对象(NSObject 的子类)来保存来自 CLBeacon 的信息。这对于检查信标是否已经在您的阵列中非常有用

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com