【问题标题】:iOS how does NSMutableArray check if it contains NSNumber objects?iOS 如何检查 NSMutableArray 是否包含 NSNumber 对象?
【发布时间】:2013-12-12 16:57:06
【问题描述】:

我正在编写一些代码,这些代码将使用 NSMutableArray 并在其中存储 int 值,封装在 NSNumbers 中。

我想确认使用具有相同值的新 NSNumber 查询 iOS NSArray 或 NSMutableArray 是合法的,如果我需要显式迭代数组,并检查每个 int 值是否相等到我要测试的值?

这似乎有效:

NSMutableArray* walkableTiles = [NSMutableArray array];    


[walkableTiles addObject:@(1)];
[walkableTiles addObject:@(2)];
[walkableTiles addObject:@(3)];


if([walkableTiles containsObject:@(1)])
{
    DLog(@"contains 1"); //test passes
}
if([walkableTiles containsObject:[NSNumber numberWithFloat:2.0]])
{
    DLog(@"contains 2");//test passes
}
if([walkableTiles containsObject:[NSNumber numberWithInt:3]])
{
    DLog(@"contains 3");//test passes
}

【问题讨论】:

  • 你说的合法是什么意思?我很确定containsObject: 在某个时候会遍历数组。
  • 您阅读过 containsObject 的规范吗? “此方法通过向数组的每个对象发送 isEqual: 消息(并将 anObject 作为参数传递给每个 isEqual: 消息)来确定数组中是否存在 anObject。”
  • 代替 NSNumber numberWithint:你可以使用文字并使用@(3)

标签: ios objective-c search nsmutablearray nsarray


【解决方案1】:

你正在做的很好。为什么不呢?

containsObject: 方法实际上会遍历数组,并对传入您正在检查的对象的每个对象调用 isEqual: 方法。

顺便说一句 - 这里使用 NSNumber 并没有什么特别之处。任何对象类型的数组都是一样的。只要对象的类有一个有效的isEqual: 方法,它就可以工作。

【讨论】:

    【解决方案2】:

    根据Apple's NSNumber documentation,您应该使用isEqualToNumber

    isEqualToNumber:返回一个布尔值,指示是否 接收者和给定的数字相等。 - (BOOL)isEqualToNumber:(NSNumber *)aNumber

    【讨论】:

    • 但是 isEqual 可以正常工作。它只是没有那么紧密的类型。
    • (NSNumber符合NSObject,这里定义了isEqual)
    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2020-06-07
    • 2021-04-27
    相关资源
    最近更新 更多