Лучший способ реализовать Перечисления с Базовыми Данными

Я говорю константу Ваши параметры, передаваемые по значению.

Рассматривают эту ошибочную функцию:

bool isZero(int number)
{
  if (number = 0)  // whoops, should be number == 0
    return true;
  else
    return false;
}

, Если бы параметр числа был константой, компилятор остановил бы и предупредил бы нас об ошибке.

108
задан Peter Hosey 4 November 2009 в 23:22
поделиться

2 ответа

Вам нужно будет создать собственные средства доступа, если вы хотите ограничить значения перечислением. Итак, сначала вы должны объявить перечисление, например:

typedef enum {
    kPaymentFrequencyOneOff = 0,
    kPaymentFrequencyYearly = 1,
    kPaymentFrequencyMonthly = 2,
    kPaymentFrequencyWeekly = 3
} PaymentFrequency;

Затем объявите методы получения и установки для вашего свойства. Заменять существующие - плохая идея, поскольку стандартные аксессоры ожидают объект NSNumber, а не скалярный тип, и вы столкнетесь с проблемами, если что-нибудь в привязках или системах KVO попытается получить доступ к вашему значению.

- (PaymentFrequency)itemTypeRaw {
    return (PaymentFrequency)[[self itemType] intValue];
}

- (void)setItemTypeRaw:(PaymentFrequency)type {
    [self setItemType:[NSNumber numberWithInt:type]];
}

Наконец, вам следует реализовать + keyPathsForValuesAffecting , чтобы получать уведомления KVO для itemTypeRaw при изменении itemType.

+ (NSSet *)keyPathsForValuesAffectingItemTypeRaw {
    return [NSSet setWithObject:@"itemType"];
}
130
ответ дан 24 November 2019 в 03:29
поделиться

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

22
ответ дан 24 November 2019 в 03:29
поделиться