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");
}
Это ничего не делало. Есть ли другой способ проверить это?
Ответы
Ответ 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