LoginSignup
0
1

SwiftUI Textで文字列がnilな場合に表示する代替テキストを多言語化する

Posted at

環境

Xcode 14.3.1

Textの多言語化

SwiftUIのTextなどは文字列を与えることができます。

struct ContentView: View {
    var body: some View {
        Text("No Name")
            .font(.title)
            .fontWeight(.bold)
    }
}

この時、No Name という文字列に対してLocalizable.stringsで多言語化を行なっていると、多言語化された文字列が表示されることになります。日本語で (名前なし) と表示されています。

スクリーンショット 2023-08-10 16.50.49.png

Textに与えられる文字列がnilの場合の代替テキストの多言語化

もし名前が与えられていたら名前を表示し、名前がない場合は、多言語化された名前がないことを示す代替テキストを表示しようと以下のようなViewを作成してみました。

struct ContentView: View {
    let name: String?
    var body: some View {
        Text(name ?? "No Name")
            .font(.title)
            .fontWeight(.bold)
    }
}

しかしこれは意図した通りには動きません。nameがnilの場合、No Name が表示されることになります。

スクリーンショット 2023-08-10 16.51.06.png

これは、ただ単に固定の文字列が与えられている場合、TextはLocalizedStringKeyと判断して多言語化を行いますが、今回はまずnameが与えられ、nameはStringのため、後に続く"No Name"もStringとして認識するからです。

struct ContentView: View {
    let name: String?
    var body: some View {
        if let name {
            Text(name)
                .font(.title)
                .fontWeight(.bold)
        } else {
            Text("No Name")
                .font(.title)
                .fontWeight(.bold)
        }
    }
}

上のようにnameのnilチェックを行なって分岐すれば多言語化されますが、後に続くViewModifierも丸ごと追記しないといけません。

結論

Group を使うことでStringがnilの場合の多言語化を行うことが可能です。

struct ContentView: View {
    let name: String?
    var body: some View {
        Group {
            if let name {
                Text(name)
            } else {
                Text("No Name")
            }
        }
        .font(.title)
        .fontWeight(.bold)
    }
}

Groupを使い、中でnameの有無でTextの値をセットし、そしてGroupに対してViewModifierをつけることにより、共通的にTextにViewModifierを与えることが可能になりました。

0
1
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
0
1