如何检查一个对象是否是 NSArray 上的最后一个对象

问题描述 投票:0回答:4

如何检查最后一个对象中的对象是否位于

NSArray
上?

我已经尝试过:

if ([currentStore isEqual:[Stores lastObject]])
{
  //Code
}

但是没有成功。

有什么想法吗?

谢谢!

objective-c cocoa-touch nsmutablearray
4个回答
0
投票

或者试试这个

BOOL lastElement = false;
NSUInteger index = [stores indexOfObject:currentStore];
if (index != NSNotFound)
{
    lastElement = (index == [stores count] - 1);
}

0
投票

修改了一下试试这个:

 NSUInteger index = [stores indexOfObject:currentStore];
            if (index == ([stores count]-1))
            {
                NSLog(@"Yes its Last");
            }

0
投票

如果您没有重写 isEqual 方法,则 NSObject::isEqual 的基类实现仅检查两个指针是否指向同一地址。

这篇优秀的文章http://nshipster.com/equality/解释了 objc 平等原则

以下示例日志 - 测试商店 - 工作正常

@interface Stores : NSObject

@property (strong, nonatomic) NSString* name;

- (instancetype) initWithName:(NSString*) name;

@end

@implementation Stores

- (instancetype) initWithName:(NSString*) name;
{
    _name = name;
    return self;
}


- (BOOL)isEqualToStores:(Stores*) Stores
{
    if (!Stores)
        return NO;

    if (![_name isEqualToString:Stores.name] )
        return NO;

    return YES;
}

- (BOOL)isEqual:(id)object
{
    if (self == object)
    {
        return YES;
    }

    if (![object isKindOfClass:[Stores class]])
    {
        return NO;
    }

    return [self isEqualToStores:(Stores *)object];
}

@end

-(void) testStores
{
    Stores* last = [[Stores alloc] initWithName:@"5"];
    NSArray* arr = @[
                     [[Stores alloc] initWithName:@"1"],
                     [[Stores alloc] initWithName:@"2"],
                     [[Stores alloc] initWithName:@"3"],
                     [[Stores alloc] initWithName:@"4"],
                     [[Stores alloc] initWithName:@"5"]
                     //last
                    ];

    if ([last isEqual:[arr lastObject]])
    {
        NSLog(@"Testing Stores - works fine");
    }
    else
    {
        NSLog(@"Testing Stores - opps!?1?!?");
    }
}  

0
投票

问题中没有足够的细节,但我认为需要注意一些。

  1. 一个
    NSArray
    对象可以在不同的索引中包含多次相同的项目,因此如果同一个对象既出现在中间的某个位置又作为最后一个对象,那么这里的许多建议将不起作用。例如
      NSString *a = @"A";
      NSString *b = @"B";
      NSString *c = @"C";
      NSString *d = @"D";
      NSArray *arr = @[a,b,a,c,b,b,c,c,d,a,d,b,d];

这里

d
既是
arr
中的最后一个对象,但它也出现在索引 8 和 10 中。

所以如果你问

if ([stores indexOfObject:currentStore] == (stores.count - 1))

你会得到错误的答案 - 因为

indexOfObject:
将返回 8,而最后一个索引是 13。

  1. 方法
    isEqual:
    不检查IDENTITY而是检查EQUALITY。不同的对象可以相等,例如
    NSString *ab = @"AB";
    NSString *a = @"A";
    NSString *ab2 = [a stringByAppendingString:@"B"]];

现在

[ab isEqual:ab2]
ab
ab2
不是同一个对象。

  1. 您的代码通常没问题,您只需将
    isEqual:
    替换为简单的
    ==
    运算符即可使其按预期工作。
    if ([currentStore == [Stores lastObject]])
    {
      //Code
    }
© www.soinside.com 2019 - 2024. All rights reserved.