web-dev-qa-db-ja.com

iOS SDKはキューとスタックを提供しますか?

私はiPhoneアプリを書いていて、Appleの Foundation Framework にNSQueueまたはNSStackクラスがないように思えます。 NSMutableArray から始めれば、自分でロールするのは非常に簡単だと思うので、何かを見逃していない限り、そうします。私は何かを見逃しましたか?

34
Tommy Herbert

私が知る限り、利用可能なジェネリッククラスはありません。 NSMutableArrayを使用してみてください。addObjectを介して追加し、objectAtIndexとremoveObjectAtIndexを介して最初と最後を取得してください。

22
Michael W.

私の後に来る人に役立つ場合に備えて、これが私のStackクラスです。ご覧のとおり、popメソッドには、それを分解したいだけの十分なコードが含まれています。

Stack.h:

#import <Foundation/Foundation.h>

@interface Stack : NSObject {
    NSMutableArray *contents;
}

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

@end

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
28
Tommy Herbert

私はこのパーティーに少し遅れましたが、CHDataStructuresを知っていますか?

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

6
occulus

別の簡単な方法は、Objective Cのカテゴリを利用してNSMutableArrayの機能を拡張することです。これを行うには、プロジェクトに2つのファイルを追加します。

NSMutableArray + Stack.h

@interface NSMutableArray (StackExtension)

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

@end

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

これで、スタックのようにプロジェクトの他のすべてのファイルで通常のNSMutableArrayを使用し、そのオブジェクトでPushまたはpopを呼び出すことができます。それらのファイルで#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);

ログ出力は次のようになります。

hello universe
hello world
6
Mischa

動作するiOS Objective CキューオブジェクトをGitHubに配置しました。コードはさまざまな投稿から取得されたものであり、決して私の所有ではありません。

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

何か問題があったらフォークしてプルリクエストを送ってください!

5

ObjectiveSugar は、非常に人気のあるCocoaPodであり、他のすばらしい機能の中で、Pushおよびpop AP​​I呼び出しをNSMutableArrayで提供します。確かに、それはiOS SDKにはありませんが、同じものを探していたのでここで共有しています。これは私が使ったソリューションでした(そして、このCocoaPodをすでに使用していたことは確かに害にはなりませんでしたコードベース)。

1
Gabe

はい、NSMutableArrayはスタックまたはキューを兼ねています。 (キューとしては少し非効率的です。)

C++のstackおよびqueueアダプターを使用することもできますが、Objective-Cオブジェクトを一緒に格納する場合、メモリ管理が少し面倒になります。

1
kennytm

いいえ、何も見逃していません。それで全部です。 Objective-Cは、Cに似た高レベルの言語です。低レベルの制御は必要ありません。

Cocoaクラスは、効率よりも使いやすいように設計されています。パフォーマンスを処理したい場合は、生のC(またはC++)実装のオプションがあります。それ以外の場合は、簡単な方法を使用します。もちろん、早期最適化は悪です。

ある種のカプセル化が必要な場合は、NSMutableArrayを含む新しいクラスを作成してください。内側のNSMutableArrayを非表示にし、必要なものを公開します。しかし、これは不要であることに気付くでしょう。

0
Eonil