Подтвердить что ты не робот

Typedef NS_OPTIONS проверяет, как UIViewAutoresizing

Краткое введение в то, что я хочу достичь:
У меня есть пользовательский UIView, где я хочу сделать стрелки видимыми, например, на нижней и левой сторонах. Я думал, что это можно сделать так же, как это делает UIViewAutoresizing.

Итак, для моего пользовательского представления я создал аналогичный typedef:

typedef NS_OPTIONS(NSUInteger, Arrows) {
    ArrowNone      = 0,
    ArrowRight     = 1 << 0,
    ArrowBottom    = 1 << 1,
    ArrowLeft      = 1 << 2,
    ArrowTop       = 1 << 3
};

Также в моем пользовательском файле заголовка просмотра я добавил:

@property (nonatomic) Arrows arrows;

Все это работает, и теперь я могу установить свойство:
customview.arrows = (ArrowBottom | ArrowLeft);

Это возвращает 6.

Теперь мой вопрос, как можно проверить, содержит ли мое свойство arrows нижнее и левое? Я пробовал:

if (self.arrows == ArrowLeft) {
    NSLog(@"Show arrow left");
}

Это ничего не делало. Есть ли другой способ проверить это?

4b9b3361

Ответ 1

Правильный способ проверки вашей битовой маски заключается в расшифровке значения с помощью оператора AND (&) следующим образом:

Arrows a = (ArrowLeft | ArrowRight);    
if (a & ArrowBottom) {
   NSLog(@"arrow bottom code here");    
}

if (a & ArrowLeft) {
   NSLog(@"arrow left code here");    
}    

if (a & ArrowRight) {
   NSLog(@"arrow right code here");    
}

if (a & ArrowTop) {
   NSLog(@"arrow top code here");    
}

Это будет отображаться на консоли:

arrow left code here
arrow right code here

Ответ 2

Чтобы выполнить сложную проверку, вы можете использовать следующий код:

if ((a & ArrowRight) && (a & ArrowTop)) {
       NSLog(@"arrow right and top code here");    
}

Ответ 3

Правильный способ проверить это значение - сначала поразрядно, а значения и затем проверьте равенство на требуемое значение.

Arrows a = (ArrowBottom | ArrowLeft);    
if (((a & ArrowBottom) == ArrowBottom) && ((a & ArrowLeft) == ArrowLeft)) {
    // arrow bottom-left
}

В следующей ссылке объясняется, почему это правильно, и дает другое представление о перечисленных типах.

Ссылка: checking-for-a-value-in-a-bit-mask