Переопределить статическую константу int в файле .h в Objective-C?

#ios #objective-c #iphone #user-interface #view

#iOS #objective-c #iPhone #пользовательский интерфейс #Вид

Вопрос:

Я пытаюсь создать приложение в OC и иметь константу в .h файле, подобную этой, которая определяет, сколько столбцов должно быть в меню:

 // cellManager.h
static int const cellNumberPerRow = 4;
  

Теперь в моем файле view manager ( .m ) мне нужно изменить количество столбцов на 3 при изменении размера шрифта. До сих пор я пытался:

 // menuManagerView.m
if ([self isBigFontSize]) {
     // ....
     cellNumberPerRow = 3;
     // ...
  

Но это выдает мне ошибку Cannot assign to variable 'cellNumberPerRow' with const-qualified type 'const int' ; И когда я пытался добавить идентификатор раньше, как это:

 static int const cellNumberPerRow = 3;
  

Появляется предупреждение Unused variable 'cellNumberPerRow' , и номер столбца остается 4;

Я чувствую, что должен быть элегантный способ сделать это, но нигде не смог его найти. Я действительно новичок в разработке iOS, поэтому был бы признателен за чей-либо вклад, спасибо!

Обновить

Я определил новую целочисленную переменную, присвоил ей значение переменной const и заменил все старые cellNumberPerRoe новой переменной в .m файле. Теперь это сработало. Но мне интересно, есть ли какой-нибудь лучший способ сделать это?

 static int newCellNumberPerRow = cellNumberPerRow;
  

Ответ №1:

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

В качестве альтернативы я бы предложил вычисляемое свойство в вашем классе файлового менеджера, определенное следующим образом:

 typedef NS_ENUM(int, CellNumberPerRow) {
    defaultCellNumberPerRow = 4,
    smallerCellNumberPerRow = 3,
};

@interface YourManager: NSObject
@property(readonly,nonatomic) int currentCellNumberPerRow;
@end

@implementation DocumentItem
-(int)currentCellNumberPerRow {
     if ([self isBigFontSize]) {
        return smallerCellNumberPerRow;
     }
     return defaultCellNumberPerRow;
}
@end
  

Теперь, чтобы получить соответствующий номер ячейки в строке, вместо этого вы должны использовать currentCellNumberPerRow свойство.

Возможно, создание currentCellNumberPerRow свойства класса @property(class,...) вместо свойства экземпляра также может оказаться удобным.