在Objective C中,是否有一个单行或小的东西要删除(缩短一个)并返回数组的第一个元素,而不管它的索引是什么?
答案 0 :(得分:21)
我不知道返回删除项目的方法,但您可以使用NSArray#objectAtIndex:0
和NSMutableArray#removeObjectAtIndex:0
的组合来执行此操作。我想你可以在NSMutableArray
上引入一个实现shift
方法的新方法类别。
答案 1 :(得分:3)
这将是一件糟糕的事情。
iPhone上的Objective-C实际上可以使用C的大部分性能优势。
如果你看看我的其他一些帖子,你会发现我对于过早优化很不利,但是当你在C级编码时,有一些你不做不必要的事情。
您可能想要的是一个良好实施的队列。预先分配足够大的循环内存结构然后有两个指针跟踪第一个和最后一个字节的东西。
听说Objective-C没有队列数据结构,我会感到非常惊讶。
另外,不要争取单线。关于简洁代码的所有内容都被高估了。如果调用方法更有意义,那就这样吧。
答案 2 :(得分:2)
协助原始海报肯定为时已晚,但如果你有一个普通的NSArray而不是NSMutableArray,那么效果很好:
id myData = myArray.firstObject;
myArray = [myArray subarrayWithRange:NSMakeRange(1, myArray.count - 1)];
答案 3 :(得分:1)
Cocoa数组对象(NSArray / NSMutableArray)不提供单行等效项 - 您必须先读取对象,然后将其删除。这些类提供方法-lastObject
和-removeLastObject
但不提供-firstObject
和-removeFirstObject
的事实应该提醒一下,从数组前面删除通常是一种低效的操作,因为内容必须向前移动(复制)一个位置。对于C中的数组尤其如此,这些数组本身与指针绑定。
如果您正在使用除原始数据类型和/或非常小的数组之外的任何内容,您可能需要考虑“移开”第一个元素的行为表示queue data structure。有关如何为对象创建队列的详细信息,请参阅this SO question。就个人而言,my opinion for that question是真正的队列类提供最干净的编程习惯。您甚至可以定义自己的方法(可能作为NSMutableArray或其他类的类别)确实提供一个单行代码来执行您想要的操作:
@interface NSMutableArray (QueueOneLiner)
- (id) removeAndReturnFirstObject; // Verbose, but clearer than "shift"
@end
@implementation NSMutableArray (QueueOneLiner)
- (id) removeAndReturnFirstObject {
id object = [[self objectAtIndex:0] retain];
[self removeObjectAtIndex:0];
return [object autorelease];
}
@end
但是,到那时,解决方案可能会带来更多的开销,这取决于您对简单性与使用它的代码性能的重要性。
答案 4 :(得分:1)
如果您有一个数组obj *arr
,其中obj
是一个类/类型名称而arr
是数组,那么您可以说arr+1
来获取没有第一个数组的数组元件。
答案 5 :(得分:0)
使用此代码,
[arrayName removeObjectAtIndex:0];
这可能会对你有所帮助