如何检查最后一个对象中的对象是否位于
NSArray
上?
我已经尝试过:
if ([currentStore isEqual:[Stores lastObject]])
{
//Code
}
但是没有成功。
有什么想法吗?
谢谢!
或者试试这个
BOOL lastElement = false;
NSUInteger index = [stores indexOfObject:currentStore];
if (index != NSNotFound)
{
lastElement = (index == [stores count] - 1);
}
修改了一下试试这个:
NSUInteger index = [stores indexOfObject:currentStore];
if (index == ([stores count]-1))
{
NSLog(@"Yes its Last");
}
如果您没有重写 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?!?");
}
}
问题中没有足够的细节,但我认为需要注意一些。
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。
isEqual:
不检查IDENTITY而是检查EQUALITY。不同的对象可以相等,例如 NSString *ab = @"AB";
NSString *a = @"A";
NSString *ab2 = [a stringByAppendingString:@"B"]];
现在
[ab isEqual:ab2]
但 ab
与 ab2
不是同一个对象。
isEqual:
替换为简单的 ==
运算符即可使其按预期工作。 if ([currentStore == [Stores lastObject]])
{
//Code
}