iOS SDK是否提供队列和堆栈?

Tom*_*ert 34 queue stack ios

我正在编写一个iPhone应用程序,我很惊讶Apple的Foundation Framework中似乎没有NSQueue或NSStack类.我看到从NSMutableArray开始自己滚动很容易,所以除非我错过了什么,否则我会这样做.我错过了什么吗?

Tom*_*ert 28

这是我的Stack类,以防它对那些追随我的人有用.正如您所看到的,pop方法涉及足够的代码,您需要将其分解出来.

Stack.h:

#import <Foundation/Foundation.h>

@interface Stack : NSObject {
    NSMutableArray *contents;
}

- (void)push:(id)object;
- (id)pop;

@end
Run Code Online (Sandbox Code Playgroud)

Stack.m

#import "Stack.h"

@implementation Stack

// superclass overrides

- (id)init {
    if (self = [super init]) {
        contents = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)dealloc {
    [contents release];
    [super dealloc];
}

// Stack methods

- (void)push:(id)object {
    [contents addObject:object];
}

- (id)pop {
    id returnObject = [[contents lastObject] retain];
    if (returnObject) {
            [contents removeLastObject];
    }
    return [returnObject autorelease];
}

@end
Run Code Online (Sandbox Code Playgroud)

  • 对于pop方法,可以使用[contents lastObject]保存一些输入.如果数组为空,那将返回nil.我最终将这些方法实现为NSMutableArray上的一个类别.谢谢你的代码! (2认同)

Mic*_* W. 22

据我所知,没有通用类avaialbe.尝试使用NSMutableArray,通过addObject添加并通过objectAtIndex和removeObjectAtIndex获取第一个/最后一个.

  • 请注意,“removeObjectAtIndex”是一个 O(n) 操作,因此当预计项目数量很大时,这可能不是队列的最佳方法。使用链表(允许从任何点进行有效的添加和删除)可能要好得多,但不幸的是,这是基础中缺少的另一种常见集合类型,因此您也必须实现它。 (2认同)

occ*_*lus 6

我参加这个派对有点晚了,但是你知道CHDataStructures吗?

http://cocoaheads.byu.edu/code/CHDataStructures

  • 这太棒了!感谢分享! (2认同)

Mis*_*cha 6

另一种简单的方法是NSMutableArray通过使用Objective C的类别来扩展其功能.您可以通过向项目添加两个文件来实现:

NSMutableArray里+ Stack.h

@interface NSMutableArray (StackExtension)

- (void)push:(id)object;
- (id)pop;

@end
Run Code Online (Sandbox Code Playgroud)

NSMutableArray里+ Stack.m

#import "NSMutableArray+Stack.h"

@implementation NSMutableArray (StackExtension)

- (void)push:(id)object {
    [self addObject:object];
}

- (id)pop {
    id lastObject = [self lastObject];
    [self removeLastObject];
    return lastObject;
}

@end
Run Code Online (Sandbox Code Playgroud)

现在,您可以NSMutableArray在项目的每个其他文件中使用常规,例如堆栈,调用pushpop该对象.不要忘记#import NSMutableArray+Stack.h在那些文件中.下面是一些示例代码,您可以将新的NSMutableArray用作堆栈:

NSMutableArray *myStack = [[NSMutableArray alloc] init]; // stack size = 0

NSString *aString = @"hello world";
[myStack push:myString];            // stack size = 1

NSString *anotherString = @"hello universe";
[myStack push:anotherString];       // stack size = 2

NSString *topMostStackObject; 

topMostStackObject = [myStack pop]; // stack size = 1
NSLog("%@",topMostStackObject);

topMostStackObject = [myStack pop]; // stack size = 0
NSLog("%@",topMostStackObject);
Run Code Online (Sandbox Code Playgroud)

日志输出将是:

hello universe
hello world
Run Code Online (Sandbox Code Playgroud)


por*_*ast 5

我在GitHub上放了一个有效的iOS Objective C队列对象.代码来自各个职位,绝不是我拥有的.

https://github.com/esromneb/ios-queue-object/

如果你看到任何问题请叉,并提出拉动请求!