Передача NSLocalizedString в качестве параметра - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть класс MyOperation, который имеет свойство localizedTitle, которое должно возвращать локализованный заголовок, но заголовок устанавливается извне:

@interface MyOperation

- (instancetype)initWithTitle:(NSString*)title;

@property (readOnly) NSString *localizedTitle;

@end

@interface PTImageOperationSession() {
  NSString* _operationTitle;
}

@implementation MyOperation

- (instancetype)initWithTitle:(NSString*)title

{
  [self retainSelf];
  self = [super init];
  if (self)
  {
    _operationTitle = title;
  }
  return self;
}

- (NSString *)localizedTitle {
  return _operationTitle;
}
@end


- (void)foo {
  MyOperation *operation = [[MyOperation alloc] initWithTitle:NSLocalizedString(@"MyLocalizedTitle", nil)]; // Good.

  NSSting *titleString = [self titleString]; // Can be different strings at runtime.
  MyOperation *operation1 = [[MyOperation alloc] initWithTitle: titleString]; // Bad because the title is not localized.
}

Вопрос: Можно ли гарантировать, что класс всегда будет инициализирован с локализованным заголовком? Моя обязанность как владельца класса - вернуть локализованный заголовок, но он устанавливается извне, поэтому я не могу его контролировать. Вы бы назвали это «проблемой дизайна»?

1 Ответ

0 голосов
/ 05 ноября 2018

Передача переменной в макрос NSLocalizedString не должна быть проблемой, вот что я сделал для тестирования:

Localizable.strings

"MyString"="My sample localized string";

И мой TestClass

@interface TestClass : NSObject
@property (readonly) NSString *localizedTitle;

-(instancetype)initWithTitle:(NSString *)title;
@end

@implementation TestClass {
    NSString *_title;
}

-(instancetype)initWithTitle:(NSString *)title {
    self = [super init];
    if (self) {
        _title = NSLocalizedString(title, nil);
    }
    return self;
}

-(NSString *)localizedTitle {
    return _title;
}
@end

Инициируйте мой тестовый класс, затем получите доступ к его свойству

TestClass *myClass = [[TestClass alloc] initWithTitle:@"MyString"];
NSLog(@"%@", myClass.localizedTitle);

Вот что у меня в консоли:

2018-11-05 19:16:36.268393 TestApp[1471:352553] My sample localized string

Обновление

Макрос:

#define NSLocalizedString(key, comment) \
        [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]

Является ли ярлык для функции localizedStringForKey:value:table: и в соответствии с документом:

Возвращаемое значение

Локализованная версия строки, обозначенная ключом в таблица tableName. Этот метод возвращает следующее, когда ключ равен нулю или не найдено в таблице:

Если ключ равен нулю, а значение равно нулю, возвращает пустую строку.

Если ключ равен нулю, а значение не равно нулю, возвращает значение.

Если ключ не найден и значение равно nil или пустой строке, возвращается ключ.

Если ключ не найден, а значение не ноль и не пусто, вернуть значение.

Если вы передадите ключ несуществования в макрос, вы получите сам ключ. Это назначенное поведение.

Кстати, в общем смысле вы не можете запросить локализованную строку, если она не определена, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...