2011-01-13 2 views
1

Im пытается установить массив для программы таймера im, записывающей в xcode. значения находятся в секундах, и я хочу, чтобы в конструкторе интерфейса была кнопка, которая запускает таймер с таким количеством секунд. Это struct im пытается объявить, чтобы предоставить время в файле заголовка .h. его просто массив с двумя массивами в нем, который я мог бы назвать с помощью @ collegeTimes.constructive или что-то подобное.Значения Array в приложении Cocoa - Инициализатор не является постоянной ошибкой

Заранее благодарен!

- (NSDictionary *)debateTimes; 
id debateTimes = [[NSDictionary alloc] initWithObjectsAndKeys: 
[NSDictionary dictionaryWithObjectsAndKeys: 
    @"540", @"constructive", 
    @"360", @"rebuttal", 
    @"180", @"cx", 
    @"600", @"prep", 
    nil], @"collegeTimes", 
[NSDictionary dictionaryWithObjectsAndKeys: 
    @"480", @"constructive", 
    @"300", @"rebuttal", 
    @"180", @"cx", 
    @"480", @"prep", 
    nil], @"hsTimes", 
        nil]; \\error is called here. 

ответ

4

Это структура им пытаются объявить предоставить раз в .h файле заголовка

Это проблема. Вы не можете создавать постоянные объекты NSDictionary (или большинство других объектов NS, если на то пошло) вне функции. Один из способов сделать то, что Wou хотят будет выглядеть следующим образом:

something.h

@interface SomeThing : NSObject 
{ 
    ... 
} 
+ (NSDictionary *)debateTimes; 
@end 

SomeThing.m

static NSDictionary * staticDebateTimes = nil; 
@implementation SomeThing 
... 
+ (NSDictionary *)debateTimes 
{ 
    if (staticDebateTimes == nil) 
    { 
     staticDebateTimes = [[NSDictionary alloc] initWithObjectsAndKeys: 
      [NSDictionary dictionaryWithObjects:... 
    } 
    return staticDebateTimes; 
} 
@end 

Этот код будет n может использоваться извне следующим образом:

NSDictionary * debateTimes = [SomeThing debateTimes]; 
+0

+1 Кроме того, желательно разместить статическое содержимое внутри '+ [SomeThing debateTimes]', когда это возможно: 'static NSDictionary * const staticDebateTimes = CreateDebateTimesDictionary();' – justin

+0

@Justin: Вы знаете, это имеет смысл, но у меня никогда не было видел, как это делается внутри тела метода. Есть ли причина предпочитать одну над другой? –

+0

уменьшает вероятность ошибки/повторного использования/неправильного использования/столкновений из-за локальности. он также инициализируется при входе, вы можете удалить nil-check. это еще один пример того, как использовать статические данные, что лучше всего подходит для контекста - в каждом конкретном случае. немного чище, и хорошая добавленная безопасность. – justin

2

Объект-объект объекту-объектив нельзя назначить вне функции. Когда переменная назначается вне функции, ее значение становится частью исполняемого файла. Поскольку значение указателя на объект неизвестно до выполнения, вы не можете назначить объект до его создания. (Constant NSStrings являются исключением из этого, так как они также являются частью исполняемого файла)

Лучший способ хранения такой структуры - использовать массив c-структур.

typedef struct { 
    char *name; 

    NSTimeInterval constructive; 
    NSTimeInterval rebuttal; 
    NSTimeInterval cx; 
    NSTimeInterval prep; 
} DebateTime; 
DebateTime[2] = {{"collegeTimes", 540, 360, 180, 600}, 
       {"hsTimes", 480, 300, 180, 480}}; 

Вы также можете изменить имя и временные интервалы на постоянные строки, если хотите.

Смежные вопросы