Альтернативы запланированному подклассу NSDictionary, который является синглтоном - PullRequest
2 голосов
/ 15 марта 2012

Я успешно создал подкласс NSDictionary, синглтон, который предназначен для хранения набора подсказок и ответов. Я видел некоторые странные поведения, которые я проследил до того факта, что подклассы NSDictionary фактически приводят к NSCFDictionary, поэтому методы NSDictionary, которые я планировал использовать, не будут работать, пока я их не напишу. Я нашел кое-что полезное в двух других SO-вопросах: здесь и здесь . Я вижу, что могут быть некоторые обходные пути, но у них тоже есть проблемы.

Я жестко запрограммировал некоторые примеры подсказок и ответов для целей тестирования, чтобы позже перейти к некоторому подходу Core Data. Я почти уверен, что продолжение моего нынешнего подхода потребует много усилий для тестирования. Вот варианты, которые я рассматриваю; какие-нибудь рекомендации?

  1. Удалите одноэлементный подход временного словаря и замените его парой массивов, которые более или менее имитируют словарь для целей тестирования?
  2. Переключиться на NSMutableDictionary, хотя я не собираюсь мутировать? Изменяемая версия выглядит так, как будто подкласс может быть проще, но я не уверен.
  3. Перейдите к некоторым глобальным константным массивам и пропустите одноэлементный подход для целей тестирования (надеюсь, это правильные термины).
  4. Записывать / перезаписывать нужные методы?
  5. Укусить пулю и выяснить часть приложения Core Data?
  6. Что-то еще?

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

Чтобы избежать головной боли при создании подкласса NSDictionary, я бы использовал отдельный одноэлементный объект, который использует композицию для владения NSDictionary.Будет ли это работать или нет, зависит от того, что еще вы надеетесь сделать с этим синглтоном.

См. Как должен выглядеть мой синглтон Objective C? для обсуждения различных Objective-Синглтон варианты.

3 голосов
/ 15 марта 2012

Необычно иметь подкласс любого из классов коллекций, которые предоставляет среда Foundation (NSArray, NSDictionary, NSSet, NSMapTable и т. Д. И их изменяемые варианты). На самом деле, это настолько необычно, что, если вы думаете, что вам нужно это сделать, вашим первым шагом должно быть тщательно подумать, зачем вам это нужно, а затем спать на нем. (Если вы хотите, чтобы кто-то попробовал, посмотрите недавнюю статью Майка Эша о переопределении NSMutableArray .) Причина, по которой столь необычно создавать подкласс класса коллекции, заключается в том, что классы коллекции уже реализуют поведение требуется стандартными структурами данных, которые они представляют: NSArray предоставляет вам индексированный список объектов; NSDictionary дает вам ассоциативный массив; и т. д.

Судя по вашим комментариям, может показаться, что вам хорошо подойдет некоторая комбинация контейнеров. Трудно точно сказать, что вы хотите из своего описания, поэтому мне придется сделать некоторые предположения (которые я постараюсь изложить) и надеяться, что даже если они ошибочны, вас все равно могут указать в правильном направлении. Итак, допустим, у вас есть список вопросов, и на каждый вопрос у вас есть ответ и некоторое количество подсказок. В этом случае вы можете использовать словарь для представления каждого вопроса. Словарь может иметь три ключа: «вопрос», «ответ» и «подсказки». Значения, связанные с первыми двумя ключами, могут быть просто строками, а значение для «ключей» может быть массивом или набором строк. И поскольку у вас есть несколько вопросов, вы должны хранить каждый из этих словарей в общем массиве. В формате JSON это выглядело бы так:

[
    {
        "question" : "What's the capitol of New York?",
        "answer" : "Albany",
        "clues" : 
            [
                "It's not New York City.",
                "It's near the Hudson river.",
                "Its name begins with 'A'."
            ]
    },
    {
        "question" : "What's the state sport of Maryland?",
        "answer" : "jousting",
        "clues" : 
            [
                "If you try it, you'll need a horse and some armor.",
                "Kids, don't try this at home."
            ]
    }
]

Вы можете создать это программно, если хотите, но, поскольку это всего лишь статические данные, вам лучше использовать Редактор списка свойств для создания данных. Тогда вы можете просто прочитать его в массив, используя +arrayWithContentsOfFile:.

Теперь об этом синглтоне ... Звучит так, будто вам действительно нужен объект, который будет хранить ваши данные и к которому легко получить доступ. Итак, создайте класс, который может содержать массив, описанный выше:

@interface QAModel : NSObject
@property (strong) NSArray *questions;

+ (QAModel*)sharedModel

@end

@implementation QAModel
@synthesize questions = _questions;

+ (QAModel*)sharedModel
{
    if (self.sharedModel == nil) {
        sharedModel = [[QAModel alloc] init];
    }
    return sharedModel;
}

- (id)init
{
    if ((self = [super init])) {
        _questions = [NSArray arrayWithContentsOfFile:pathToMyDataFile];
    }
    return self;
}
@end

Это дает вам общий объект модели, к которому легко получить доступ. Это не настоящий синглтон, поскольку он не мешает вам создавать его более одного раза, если вы действительно этого хотите, но обычно это не то, что нужно людям, когда они говорят об использовании синглтона.

Обратите внимание, что единственный подкласс здесь - это простой подкласс NSObject - массивы и словари уже в продаже.

...