ObjecTips

Swift & Objective-C で iOS とか macOS とか

Swift での NSLocalizedString

Objective-C では

NSString *NSLocalizedString(NSString *key, NSString *comment)
NSString *NSLocalizedStringFromTable(NSString *key, NSString *tableName, NSString *comment)
NSString *NSLocalizedStringFromTableInBundle(NSString *key, NSString *tableName, NSBundle *bundle, NSString *comment)
NSString *NSLocalizedStringWithDefaultValue(NSString *key, NSString *tableName, NSBundle *bundle, NSString *value, NSString *comment)

の4つのマクロが定義されている。

いずれも NSBundle

/* Method for retrieving localized strings. */
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName NS_FORMAT_ARGUMENT(1);

メソッドを呼び出していて、それぞれ内部で引数にデフォルト値や nil を入れたりしていて外部の引数を省略している。

Swift では

/// Returns a localized string, using the main bundle if one is not specified.
func NSLocalizedString(key: String, tableName: String? = default, bundle: NSBundle = default, value: String = default, #comment: String) -> String

という関数1種類のみが定義されている。
Swift の場合は適宜自分で引数を省略する事ができるようになっていて、例えば

NSLocalizedString("key", comment: "comment");

と書く事もできるし、テーブル名を指定して

NSLocalizedString("key", tableName: "Localizable", comment: "comment");

と書く事もできる。
これらはObjective-C版の上2つのマクロ定義と同じ働きになる。
bundle を省略した場合は NSBundle.mainBundle がデフォルト値として使用され、tableName と value が省略された場合は nil がデフォルト値として使用される。
また NSBundle 自体の挙動として tableName が nil か空文字の場合にはテーブルとして Localizable.strings が使用される。