Класс iOS, правильный способ реализации нескольких строк?

Надеюсь, достаточно простой вопрос. У меня есть все строки ниже, которые я использую в классе. Эти строки добавляются к одной строке вместе с другими данными для создания удобочитаемой выходной строки.

В настоящее время у меня есть один метод, и я просто инициализирую все строки точно так, как указано внизу самого метода. Я намерен создать несколько других методов, которые будут использовать те же самые строки в классе, поэтому мой вопрос. Является ли хорошей практикой просто сделать их всеми свойствами и инициализировать их, чтобы их можно было использовать во всем классе, как в приведенном ниже примере (i знаю нерабочий код). Или есть лучший способ, которым я должен подойти к этому, я знаю, что это сработает, как я предлагаю, но как новичок я хотел бы в какой-то момент научиться правильно делать что-то. Приветствия заранее для любой помощи.

@интерфейс

@property (сильное, неатомарное) NSString *lbLabel;

... .. .. ..для каждого.. @end

@выполнение

-(id)init { self.lbLabel = NSLocalizedString(@"lb", @"lb"); .... и так далее для всех остальных...... }

@конец

// English
NSString *lbLabel = NSLocalizedString(@"lb", @"lb");
NSString *mLabel = NSLocalizedString(@"m", @"m");
NSString *mphLabel = NSLocalizedString(@"mph", @"mph");
NSString *inchLabel = NSLocalizedString(@"in", @"in");


// Metric
NSString *kgLabel = NSLocalizedString(@"kg", @"kg");
NSString *kLabel = NSLocalizedString(@"k", @"k");
NSString *kphLabel = NSLocalizedString(@"kp/h", @"kp/h");
NSString *cmLabel = NSLocalizedString(@"cm", @"cm");


//Both
NSString *liftLabel = NSLocalizedString(@"Lift:", @"Lift:");
NSString *calisthenicLabel = NSLocalizedString(@"Calisthenic:", @"Calisthenic:");
NSString *cardioLabel = NSLocalizedString(@"Cardio:", @"Cardio:");
NSString *metricsLabel = NSLocalizedString(@"Metrics:", @"Metrics:");
NSString *commentLabel = NSLocalizedString(@"Comment:", @"Comment");
NSString *setLabel = NSLocalizedString(@"Set:", @"Set:");
NSString *repsLabel = NSLocalizedString(@"Reps:", @"Reps:");
NSString *weightLabel = NSLocalizedString(@"Weight:", @"Weight:");

//Cardio Labels
NSString *timeLabel = NSLocalizedString(@"Time:", @"Time:");
NSString *distanceLabel = NSLocalizedString(@"Distance:", @"Distance:");
NSString *rateLabel = NSLocalizedString(@"Rate:", @"Rate:");
NSString *settingOneLabel = NSLocalizedString(@"Setting 1:", @"Setting 1:");
NSString *settingOneValueLabel = NSLocalizedString(@"Setting 1 Value:", @"Setting 1 Value:");
NSString *settingTwoLabel = NSLocalizedString(@"Setting 2:", @"Setting 2:");
NSString *settingTwoValueLabel = NSLocalizedString(@"Setting 2 Value:", @"Setting 2 Value:");
NSString *caloriesLabel = NSLocalizedString(@"Calories:", @"Calories:");

//Metrics Labels
NSString *heightLabel = NSLocalizedString(@"Height:", @"Height:");
NSString *neckLabel = NSLocalizedString(@"Neck:", @"Neck:");
NSString *chestLabel = NSLocalizedString(@"Chest:", @"Chest:");
NSString *waistLabel = NSLocalizedString(@"Waist:", @"Waist:");
NSString *hipsLabel = NSLocalizedString(@"Hips:", @"Hips:");
NSString *bicepsLabel = NSLocalizedString(@"Biceps:", @"Biceps:");
NSString *ForearmsLabel = NSLocalizedString(@"Forearms:", @"Forearms:");
NSString *wristsLabel = NSLocalizedString(@"Wrists:", @"Wrists:");
NSString *quadsLabel = NSLocalizedString(@"Quads/Thighs:", @"Quads/Thighs:");
NSString *calvesLabel = NSLocalizedString(@"Calves:", @"Calves:");
NSString *anlklesLabel = NSLocalizedString(@"Ankles:", @"Ankles:");
NSString *feetLabel = NSLocalizedString(@"Feet:", @"Feet:");
NSString *bmiLabel = NSLocalizedString(@"BMI:", @"BMI:");
NSString *bmrLabel = NSLocalizedString(@"BMR:", @"BMR:");
NSString *waistHeightLabel = NSLocalizedString(@"Waist/Height:", @"Waist/Height:");
NSString *waistHipsLabel = NSLocalizedString(@"Waist/Hips:", @"Waist/Hips:");
// English
NSString *lbLabel = NSLocalizedString(@"lb", @"lb");
NSString *mLabel = NSLocalizedString(@"m", @"m");
NSString *mphLabel = NSLocalizedString(@"mph", @"mph");
NSString *inchLabel = NSLocalizedString(@"in", @"in");


// Metric
NSString *kgLabel = NSLocalizedString(@"kg", @"kg");
NSString *kLabel = NSLocalizedString(@"k", @"k");
NSString *kphLabel = NSLocalizedString(@"kp/h", @"kp/h");
NSString *cmLabel = NSLocalizedString(@"cm", @"cm");


//Both
NSString *liftLabel = NSLocalizedString(@"Lift:", @"Lift:");
NSString *calisthenicLabel = NSLocalizedString(@"Calisthenic:", @"Calisthenic:");
NSString *cardioLabel = NSLocalizedString(@"Cardio:", @"Cardio:");
NSString *metricsLabel = NSLocalizedString(@"Metrics:", @"Metrics:");
NSString *commentLabel = NSLocalizedString(@"Comment:", @"Comment");
NSString *setLabel = NSLocalizedString(@"Set:", @"Set:");
NSString *repsLabel = NSLocalizedString(@"Reps:", @"Reps:");
NSString *weightLabel = NSLocalizedString(@"Weight:", @"Weight:");

//Cardio Labels
NSString *timeLabel = NSLocalizedString(@"Time:", @"Time:");
NSString *distanceLabel = NSLocalizedString(@"Distance:", @"Distance:");
NSString *rateLabel = NSLocalizedString(@"Rate:", @"Rate:");
NSString *settingOneLabel = NSLocalizedString(@"Setting 1:", @"Setting 1:");
NSString *settingOneValueLabel = NSLocalizedString(@"Setting 1 Value:", @"Setting 1 Value:");
NSString *settingTwoLabel = NSLocalizedString(@"Setting 2:", @"Setting 2:");
NSString *settingTwoValueLabel = NSLocalizedString(@"Setting 2 Value:", @"Setting 2 Value:");
NSString *caloriesLabel = NSLocalizedString(@"Calories:", @"Calories:");

//Metrics Labels
NSString *heightLabel = NSLocalizedString(@"Height:", @"Height:");
NSString *neckLabel = NSLocalizedString(@"Neck:", @"Neck:");
NSString *chestLabel = NSLocalizedString(@"Chest:", @"Chest:");
NSString *waistLabel = NSLocalizedString(@"Waist:", @"Waist:");
NSString *hipsLabel = NSLocalizedString(@"Hips:", @"Hips:");
NSString *bicepsLabel = NSLocalizedString(@"Biceps:", @"Biceps:");
NSString *ForearmsLabel = NSLocalizedString(@"Forearms:", @"Forearms:");
NSString *wristsLabel = NSLocalizedString(@"Wrists:", @"Wrists:");
NSString *quadsLabel = NSLocalizedString(@"Quads/Thighs:", @"Quads/Thighs:");
NSString *calvesLabel = NSLocalizedString(@"Calves:", @"Calves:");
NSString *anlklesLabel = NSLocalizedString(@"Ankles:", @"Ankles:");
NSString *feetLabel = NSLocalizedString(@"Feet:", @"Feet:");
NSString *bmiLabel = NSLocalizedString(@"BMI:", @"BMI:");
NSString *bmrLabel = NSLocalizedString(@"BMR:", @"BMR:");
NSString *waistHeightLabel = NSLocalizedString(@"Waist/Height:", @"Waist/Height:");
NSString *waistHipsLabel = NSLocalizedString(@"Waist/Hips:", @"Waist/Hips:");

person Narsil    schedule 05.10.2013    source источник
comment
Интересно, почему вы используете эту настройку. Почему бы, например, просто не использовать NSLocalizedString(@"timeLabel", @"time label") везде?   -  person nielsbot    schedule 06.10.2013
comment
Привет, nielsbot, если вы просто ссылаетесь на мое соглашение об именах в строках.. Ну, честно говоря, если это неправильно, это, вероятно, просто потому, что я не знаю ничего лучше, и я нуб :). Я никогда раньше полностью не локализовал продукт и просто везде использовал это соглашение, поэтому, если/когда я займусь локализацией, я думаю, что буду в лучшей форме. Любой вклад или совет всегда приветствуется. Ваше здоровье   -  person Narsil    schedule 06.10.2013
comment
Ну, я думаю, вы можете просто использовать NSLocalizedString() везде, где вам нужна локализованная строка. Проблема заключается в том, как убедиться, что ваша ключевая строка непротиворечива. Вы можете просто сделать все возможное, или вы можете использовать макросы или постоянные строки. Посетите stackoverflow.com/a/10196327/210171.   -  person nielsbot    schedule 06.10.2013


Ответы (2)


Если к ним не предполагается доступ за пределами класса, вам не нужно делать их свойствами, а также вы не должны вызывать self.[ANYTHING] внутри вашего класса, вы должны использовать метод _[variableName] класса доступ к иварам.

Поэтому лучший способ сделать это — сделать то, что вы сделали, но сделать их частными иварами.

@interface CLASSNAME ()
{
    // English
    NSString *_lbLabel = NSLocalizedString(@"lb", @"lb");
    NSString *_mLabel = NSLocalizedString(@"m", @"m");
    NSString *_mphLabel = NSLocalizedString(@"mph", @"mph");
    NSString *_inchLabel = NSLocalizedString(@"in", @"in");
    ...
}

@end

Сделайте это в файле .m вашего класса, и эти переменные будут доступны через класс, но не извне. Если вы когда-нибудь решите, что хотите, чтобы они были внешними, вы просто делаете их @properties, и, поскольку вы использовали соглашение об именах _[VARNAME], вы уже настроены на их использование, иначе имя не меняется, потому что @properties автоматически синтезируются для вас. и вы должны обращаться к ним с их именем ivar, а не с self.[VARNAME]. Чтобы прокомментировать решение словаря, да, если вы хотите передать все строки сразу, удерживая их в контейнере, было бы лучшим способом, но если вы обращаетесь к ним по отдельности, помещая их в контейнер излишний и ненужный, это проще просто получить к ним прямой доступ, и это быстрее.

person ApperleyA    schedule 05.10.2013
comment
Большое спасибо за это и за уточнение того, где и почему я должен их размещать, как вы сказали, это очень полезно для новичка, вероятно, поможет мне очистить и некоторые другие мои коды, где у меня есть свойства, которые не должны быть свойства и так далее. Еще раз спасибо! - person Narsil; 05.10.2013

Единственный способ сделать это проще, это использовать словарь и вместо того, чтобы делать

NSString *liftLabel = NSLocalizedString(@"Lift:", @"Lift:");

ты делаешь это

NSDictionary* dictionaryOfStrings = [[NSDictionary alloc] init];

затем в файле метода сделайте

NSMutableDictionary* mutableDictionary = [Dictionary dictionaryWithDictionary:self.dictionaryOfStrings];
[mutableDictionary setObject:NSLocalizedString(@"Lift:", @"Lift:") forKey:@"lift"];
self.dictionaryOfStrings = [NSDictionary dictionaryWithDictionary:mutablDictionary];

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

Затем мы определяем его как обычный NSDictionary, а не NSMutableDictionary. Изменчивость означает, что его можно изменить, но лично мне не нравится, что объектами, которые я передаю, можно так легко манипулировать, поэтому я преобразовываю неизменяемые объекты в изменяемые, а затем обратно в неизменяемые, это гарантирует, что объекты в массивом можно манипулировать только там, где я конвертирую его туда и обратно.

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

person A'sa Dickens    schedule 05.10.2013
comment
Спасибо за это, с вашим вкладом и вкладом apperley ниже, я думаю, должно быть хорошо! Ваше здоровье - person Narsil; 05.10.2013