リソース文字列をString型変数に読み込む

リソース文字列を、String型の変数に読み込む方法を紹介します。

まずリソースファイルを用意します。リソースファイルの作り方は下記のURLをご覧ください。

リソースとして埋め込まれる文字列を扱う

アプリの多言語対応などをするには、リソース文字列を扱えると便利です。リソース文字列を扱う方法を紹介します。

リソースファイルの中身は下記のようにします。ファイル名は MyRes.strings にしました。

"msg_000" = "こんにちは";
"msg_001" = "せかい";

つぎに全体の Swift のコードです。

import SwiftUI

struct ViewMain: View {

    @State var TheStr = "これはリソースのテストです."

    // ファイルタイトルを使う(拡張子は不要).
    let FILE_TITLE_RES_STR = "MyRes"

    let THE_KEY_000 = "msg_000"
    let THE_KEY_001 = "msg_001"

    @State private var str_000: String = ""
    @State private var str_001: String = ""

    @State private var str_all = "";

    var body: some View {

        VStack {

            Text( TheStr )
                .font( .title )

            Text( str_all )
                .font( .title )

        }
        .padding()
        .onAppear {
            load_string_from_resource( &str_000, THE_KEY_000, FILE_TITLE_RES_STR )
            load_string_from_resource( &str_001, THE_KEY_001, FILE_TITLE_RES_STR )
            str_all = String(format: "%@,%@.", str_000, str_001 )
        }

    }

    private func load_string_from_resource(
                    _ want: inout String,
                    _ key: String,
                    _ filename_without_ext: String
                    ) {

        let ft = filename_without_ext

        if let path = Bundle.main.path(forResource: ft, ofType: "strings") {

            if let dic = NSDictionary(contentsOfFile: path) as? [String: String] {

                if let value = dic[key] {

                    want = value

                } else {

                    want = ""

                }

            } else {

                want = ""
                return

            }

        } else {

            want = ""
            return

        }

    }

}

#Preview {
    ViewMain()
}

実行すると下図のようになります。