Вы смешиваете синтаксис Objective-C и C. @{ key:value, ... }
является литералом словаря Objective-C, @[ a, ... }
является литералом массива Objective-C, а abc->
является частью выражения C для доступа к полю struct
через указатель на структуру.
В C синтаксис { a, ... }
служит двойному назначению как массив, так и литерал структуры, определяемый контекстом. Ваш фрагмент может быть записан как:
struct Abc abc[] = { {@"hello", false},
{@"thank you", true},
{@"welcome", true}
};
, который объявляет abc
как массив, а не как указатель. При использовании типа массива с пустыми границами ([]
) размер массива на основе инициализатора и объявления и присваивания должен выполняться вместе.
Если вы хотите придерживаться типа указателя, а не использовать тип массиваВы можете при условии добавить приведение, производящее то, что С называет составным литералом , и в этом случае вы можете отделить объявление от присваивания:
struct Abc *abc;
abc = (struct Abc []){ {@"hello", false},
{@"thank you", true},
{@"welcome", true}
};
Примечание: вы не можете использоватьприведение (struct Abc *)
здесь ... C инициализатор C и составной литеральный синтаксис и семантика такие же причудливые, как и способ C (++); -)
Примечание: в Objective-C более обычно использоватьYES
& NO
вместо true
и false
, но последние принимаются как BOOL
литералы.
HTH