我有一个类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.
}
问题:是否可以确保该班级始终以本地化的标题进行初始化?作为班级所有者,我的责任是返回本地化的标题,但是该标题是从外部设置的,因此我无法控制它。您会将其标记为“设计问题”吗?
答案 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并且不为空,则返回值。
如果将不存在的密钥传递给宏,您将收到密钥本身。这就是指定的行为。
顺便说一句,按照常识,如果未定义本地化字符串,就不能要求它,对吗?