Создание пользовательских методов с unitFlags
Я хотел бы создать методы, которые принимают параметр "unitFlags", похожий на Event Kit
- (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)date.
В предыдущем методе и методе, показанном ниже, юнит-флаги могут быть установлены на несколько значений
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *comps = [gregorian components:unitFlags fromDate:date];
Я вижу, что эти методы принимают NSUInteger
, но как мне определить множественные значения, установленные, как только я флаги блока в моей реализации пользовательских методов.
3 ответа
Ключ находится в определении перечисляемых значений, которые могут быть переданы (NSYearCalendarUnit
):
typedef CF_OPTIONS(CFOptionFlags, CFCalendarUnit) {
kCFCalendarUnitEra = (1UL << 1),
kCFCalendarUnitYear = (1UL << 2),
kCFCalendarUnitMonth = (1UL << 3),
}
Вы должны определить свое собственное перечисление. Затем внутри вашего класса вы можете проверить предоставленное значение:
CFCalendarUnit testValue = ...;
if ((testValue & kCFCalendarUnitEra) == kCFCalendarUnitEra) {
// it's an era
}
if ((testValue & kCFCalendarUnitYear) == kCFCalendarUnitYear) {
// it's a year
}
Поскольку unitFlags
это битовая маска, вы можете проверить, установлен ли определенный флаг следующим образом:
if (unitFlags & NSYearCalendarUnit) { // notice it's & and not &&
// The "year" flag is set
}
if (unitFlags & NSMonthCalendarUnit) {
// The "month" flag is set
}
Для этого используйте битовую маску, например:
UIViewAutoresizing
enum {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;
Чтобы проверить, есть ли у флага опция, вы можете использовать такой метод:
- (BOOL)AutoresizingMask:(UIViewAutoresizing)autoresizing hasFlag:(UIViewAutoresizing)flag
{
return (autoresizing & flag) != 0;
}