Я пишу приложение для iPhone, и я удивлен тем, что в Apple Foundation Framework, похоже, нет классов NSQueue или NSStack. Я вижу, что было бы легко свернуть свое, начиная с NSMutableArray, поэтому я сделаю это, если не упустил что-то. Я что-то пропустил?Предоставляет ли SDK IOS очереди и стеки?
ответ
Насколько я знаю, нет универсального класса avaialbe. Попробуйте использовать NSMutableArray, добавьте через addObject и получите first/last через objectAtIndex и removeObjectAtIndex.
Да, NSMutableArray удваивается как стек или очередь. (Было бы немного неэффективным в очереди.)
Вы также можете использовать C++ 's stack
и queue
адаптер, но это делает управление памятью немного грязный, если вы хотите сохранить Objective-C объектов с ней.
Нет. Вы ничего не пропустили. Это все. Objective-C - язык более высокого уровня, похожий на C. Низкий уровень контроля не требуется.
Классы какао предназначены для более легкого использования, чем эффективность. Если вы хотите иметь дело с производительностью, у вас есть опция реализации C (или C++). В противном случае просто используйте простой способ. Конечно, ранняя оптимизация - это зло.
Если вы хотите своего рода инкапсуляцию, просто создайте новый класс, содержащий внутри него NSMutableArray. Скрывайте внутренний NSMutableArray и просто показывайте, что хотите. Но вы поймете, что это не нужно.
Вот мой класс Stack, в случае, если он полезен для тех, кто идет за мной. Как вы можете видеть, поп-метод включает в себя достаточно кода, который вы бы хотели его исключить.
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
Для метода pop вы можете сохранить немного ввода, используя [contents lastObject]. Это вернет nil, если массив пуст. Я закончил внедрение методов в качестве категории в NSMutableArray. Спасибо за код! –
Звучит неплохо - спасибо за подсказку. –
Лично я бы просто добавил метод 'pop' к' NSMutableArray' через категорию и использовал 'NSMutableArray' там, где мне нужен был стек, вместо того, чтобы создавать совершенно новый класс' Stack'. Большинство языков, которые я использовал до этого, не имеют выделенных классов стека и используют массивы в виде стеков. Я полагаю, что я вижу элегантность с точки зрения читаемости того, что класс, который может * использоваться * только как стек. –
Я поставил рабочий IOS Objective C объект очереди на GitHub. Код был взят из разных постов и никоим образом не принадлежит мне.
https://github.com/esromneb/ios-queue-object/
Если вы видите какие-либо проблемы, пожалуйста, раскошелиться и сделать запрос тянуть!
Я немного опоздал на эту вечеринку, но знаете ли вы о CHDataStructures?
Это замечательно! Спасибо, что поделился! – paiego
Другой простой способ будет расширить возможности NSMutableArray
«s путем использования категорий Objective C в. Вы можете сделать это путем добавления двух файлов в проекте:
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
ObjectiveSugar является очень популярным CocoaPod, что обеспечивает, в том числе кучу других отличные вещи, push
и pop
API вызывает на NSMutableArray
. Конечно, это не в SDK для iOS, но я делюсь им здесь, потому что я искал то же самое, и это было решение, с которым я пошел (и это, конечно, не помешало, что мы уже использовали этот CocoaPod в нашей кодовая).
- 1. Стеки и очереди
- 2. Стеки, очереди и связанные списки
- 3. Функция палиндрома (строки, стеки, очереди)
- 4. Рекурсия/стеки и очереди в cuda
- 5. Как обычно выполняются очереди и стеки?
- 6. Зачем создавать стеки и очереди java
- 7. Стеки и очереди для проверки палиндрома
- 8. Предоставляет ли «= default» возможность реализации вне очереди?
- 9. Предоставляет ли WP10 SDK возможность таргетинга WP8.1?
- 10. Предоставляет ли Metaio SDK оверлейное разрешение видео?
- 11. Итерации через структуру данных (очереди, стеки, сумка)
- 12. Как сохранить очереди и стеки в базу данных
- 13. Предоставляет ли Facebook SDK и API доступ к iDevices UDID?
- 14. Зачем создавать стеки, очереди, связанные списки и подобные в C#?
- 15. Apigee iOS SDK и SSKeychain
- 16. IOS SDK и настройки устройства
- 17. Предоставляет ли тайм-аут поддержки Laravel для работников очереди?
- 18. AWS API SDK предоставляет неверный URL-адрес
- 19. Можно ли использовать TFS SDK для создания, очереди и дорожек?
- 20. iOS sdk и Instagram
- 21. iOS разрабатывает и предоставляет частные приложения
- 22. Блоки, стеки и кучи
- 23. Есть ли минимум iOS sdk?
- 24. Facebook SDK и iOS
- 25. Предоставляет ли DJI Mobile App iOS SDK доступ ко всем функциям, доступным в приложении DJI GO?
- 26. Предоставляет ли Facebook Android SDK возможность отправлять запросы друзьям?
- 27. Нужно ли объединять эти стеки?
- 28. Стеки и их реализация
- 29. Предоставляет ли Stormpath SDK способ создания запросов для состояния NOT?
- 30. Предоставляет ли AWS SDK архитектуру, основанную на событиях?
Спасибо. Меня беспокоит дублирование кода, а не инкапсуляция. –
НЕ использовать очередь зла!, У вас есть представление о влиянии, которое имеет? NSMutable массивы НЕ предназначены для простоты использования (они, кстати, не так просто использовать AT ALL!), Они действительно эффективны и, как уже упоминалось выше, могут использоваться для реализации очередей. –
@PizzaiolaGorgonzola Прошу прощения, но очень сложно понять, что вы на самом деле имеете в виду в этом комментарии. И я никогда не говорил, что уроки какао неэффективны *. Я сказал, что классы Cocoa относительно менее эффективны и более удобны в использовании по сравнению со своими коллегами уровня C (или C++). – Eonil