Как объявить мою собственную CGRectZero как константу? - PullRequest
21 голосов
/ 14 января 2011

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

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

Как мне это объявить?

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

Ответы [ 4 ]

51 голосов
/ 14 января 2011

Другие ответы в порядке - в некоторых случаях -.

A) если его объявить, 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, это будет глобальная переменная.

21 голосов
/ 14 января 2011

Есть несколько вариантов. С С89,

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 }
};
6 голосов
/ 14 января 2011

как то так

static CGRect CGRectOne = (CGRect){.origin.x = 1.0f, .origin.y = 1.0f, .size.width = 1.0f, .size.height = 1.0f};
0 голосов
/ 03 марта 2012

Техника, используемая здесь, хорошо работала для меня: http://www.cocos2d -iphone.org / forum / topic / 2612 # post-16402

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

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

...