传递NSLocalizedString作为参数

时间:2018-11-05 09:27:36

标签: objective-c nslocalizedstring

我有一个类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 :(得分:0)

将变量传递到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或时,此方法返回以下内容   在表中找不到:

     

如果key为nil并且value为nil,则返回一个空字符串。

     

如果key为nil并且value为非nil,则返回value。

     

如果未找到键,并且值为nil或空字符串,则返回键。

     

如果未找到键,并且值不为nil并且不为空,则返回值。

如果将不存在的密钥传递给宏,您将收到密钥本身。这就是指定的行为。

顺便说一句,按照常识,如果未定义本地化字符串,就不能要求它,对吗?