LoginSignup
3
0

More than 5 years have passed since last update.

NSLocalizedString の記述を簡単にする extension

Posted at

R.swift は知らないです

使用例

Localizable.strings
"test 1"   = "test 1";
"テスト 2" = "test 2";

"format_test1"        = "format test 1 %@";
"フォーマットテスト3%@" = "format test 3 %@";
Hoge.swift
func do() {
    print("test_1".localized)    // ログ:test 1
    print("テスト 2".localized)  // ログ:test 2
    print("テスト 3".localized)  // ログ:テスト 3

    print("format_test1".localized("unko"))         // ログ:format test 1 unko
    print("format_test2".localized("unko"))         // ログ:format_test2
    print("フォーマットテスト3%@".localized("unko")) // ログ:format test 3 unko
    print("フォーマットテスト4%@".localized("unko")) // ログ:フォーマットテスト4unko

    print("format_test1".localized())         // ログ:format test 1 (null)
    print("format_test2".localized())         // ログ:format_test2
    print("フォーマットテスト3%@".localized()) // ログ:format test 3 (null)
    print("フォーマットテスト4%@".localized()) // ログ:フォーマットテスト4(null)
}

コード

extension
extension String {

    var localized: String {
        return NSLocalizedString(self, comment: "")
    }

    func localized(_ args: CVarArg...) -> String {
        return NSString(format: NSLocalizedString(self, comment: ""), arguments: getVaList(args)) as String
    }
}

備考

  • args になにも入れないと、args.count == 0 となって、(null) って表示されるけど、その辺は好きに
  • args じゃなく getVaList(args) としてるのは、
    args の型が[CVarArg]となってるせいで、それをそのまま入れると配列としての表示になっちゃうから変換しないとダメ
  • getVaList(args) の型はCVaListPointerだけど、これをうまくなんかやってくれるのは
    NSString(format: String, arguments: CVaListPointer)しかなかった
  • ロガーつくってみたとか書いてるページで CVaListPointer に言及してるページ見つけられなかったけど、なんでや

参考

getVaList とかあるんだ、って知ったページ

Swiftで引数リスト(CVaListPointer)の渡し方 - The Pragmatic Ball boy
http://yanamura.hatenablog.com/entry/2015/02/11/222814

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0