Определение перечисления в классе платформы iOS - PullRequest
4 голосов
/ 13 февраля 2012

Я просматриваю файлы заголовков фреймворка UIKit и вижу много случаев, когда определяется анонимное перечисление, за которым следует, по-видимому, связанный typedef. Может кто-нибудь объяснить, что здесь происходит?

Имеет ли тип UIViewAutoresizing как-то (неявно) ссылку на enum, объявленный в предыдущем выражении? Как бы вы относились к этому типу enum?

enum {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Дело в том, что это флаги, предназначенные для использования в качестве битовой маски, что приводит к проблемам с перечислениями. Например, если это будет выглядеть так:

typedef enum {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
} UIViewAutoresizing;

И вы бы вызвали setAutoresizingMask: для представления с UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight, компилятор будет жаловаться, и вы должны явно привести его обратно к типу UIViewAutoresizing. Однако NSUInteger может принимать битовую маску.

Кроме того, все, что сказал lef2 о том, что NSUInteger не является объектом ObjC.

3 голосов
/ 13 февраля 2012

Я думаю, что здесь вы ошиблись только в одном: NSUInteger - это не объект C-класса, это unsigned int в 32-битных системах и unsigned long в 64-битных системах.Так что на самом деле это то, что происходит:

typedef unsigned int UIViewAutoresizing;

или

typedef unsigned long UIViewAutoresizing;

Для большей справки я добавлю это:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

Источник: CocoaDev

...