Константы в Objective-C

опрос новичка C / Objective-C :-)

Допустим, я хочу константы CGRectOne и CGRectTwo.

Как я могу это заявить?

Спасибо, Джереми

Ответы на вопрос(4)

Что-то вроде этого

static CGRect CGRectOne = (CGRect){.origin.x = 1.0f, .origin.y = 1.0f, .size.width = 1.0f, .size.height = 1.0f};
 Nick Moore14 янв. 2011 г., 11:25
Это работает? Я никогда не видел этот синтаксис и не могу его скомпилировать.
 Nyx0uf14 янв. 2011 г., 11:27
Это функция C99, называемая составными литералами.
 Nick Moore14 янв. 2011 г., 11:28
Ах я вижу. Здорово. Я включил поддержку C99 с помощью-std=c99 в "Другие флаги C", и теперь это работает для меня тоже.
Решение Вопроса

в некоторых случаях-.

А) объявив этоstatic будет выдавать копию за перевод. Это хорошо, если он виден только одному переводу (то есть его определение находится в вашем.m /.c файл). В противном случае вы получите копии в каждом переводе, который включает / импортирует заголовок со статическим определением. Это может привести к раздутому двоичному файлу, а также к увеличению времени сборки.

B)const CGRect CGRectOne = {...}; будет испускать символ в объеме, который он объявил. если это заголовок, видимый для нескольких переводов, вы получите ошибку ссылки (потому чтоCGRectOne определяется несколько раз, например один раз в.c /.m файл, который прямо или косвенно включает заголовок, в котором определена константа).

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

объявить константу в заголовкеиспользовать константу во многих переводахиспуская ровно одно определение константы

extern подход идеально подходит для повторного использования константы среди нескольких файлов. Вот пример:

file.h

// the declaration in the header:
extern const CGRect CGRectOne;

File.c / м

// the definition:

#import "File.h"

const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } };

Примечание: опускаяconst просто сделал бы это глобальной переменной.

 justin25 апр. 2014 г., 18:49
@Praveen первое предположение: вы пытались объявить константу внутри@interface (или другой объем). константа extern должна быть объявлена ​​в той же (глобальной) области видимости, что и другие объявления extern C (например, функции, константы).
 Praveen09 апр. 2014 г., 09:15
Я пытался объявить, какextern const CGRect SCREENBOUNDS; в .h файле .. Но это говоритType name does not allow storage class to be specified.. вы помогаете мне понять эту ошибку?
 justin14 янв. 2011 г., 12:06
примечание: технически у вас есть больше вариантов с c ++ - я ответил так, как будто вопрос был c / objc.
 jchatard14 янв. 2011 г., 12:36
Огромное спасибо!
 samfu_127 мар. 2011 г., 05:49
Это очень помогло мне. Хороший ответ.

http://www.cocos2d-iphone.org/forum/topic/2612#post-16402

По сути это метод extern, описанный Джастином, но он дает довольно полный пример.

Кроме того, этот ответ на StackOverflow также является хорошим примером:Константы в Objective-C

const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } };

С С99,

const CGRect CGRectOne = {
    .origin.x = 0.0f,
    .origin.y = 0.0f,
    .size.width = 1.0f,
    .size.height = 1.0f
};

или же

const CGRect CGRectOne = {
    .origin = { .x = 0.0f, .y = 0.0f },
    .size   = { .width = 1.0f, .height = 1.0f }
};

Ваш ответ на вопрос