🛑

[SwiftUI] Xcode13 RC版ではTextFieldのローカライズ関連の破壊的変更に注意

2021/09/15に公開

Xcode13の最終ベータが出ました。今のベータ版では、Xcode12では普通に動いていたTextFieldのタイトルのローカライズが無効になっています

以下のコードを、iOS14をターゲットに含むプロジェクトで書いてみてください。一見同じコードに見えますが、実は上のTextFieldでは"foo"LocalizedStringKeyになるのに、下のTextFieldでは"foo"Stringになります。

struct ContentView: View {
    @State private var text = ""
    var body: some View {
        if #available(iOS 15, *) {
            TextField("foo", text: $text)   // "foo"はLocalizedStringKey扱い
        } else {
            TextField("foo", text: $text)   // "foo"はString扱い
        }
    }
}

特に#availableチェックを入れていない場合は下と同じになるので"foo"Stringになります。
このLocalizedStringKeyという型は、SwiftUIで作成したアプリケーションにおいてローカライズしたテキストを呼び出すために使われています。単なるStringではローカライズが出来ません。このため、Xcode12以前で作成したSwiftUI AppをXcode13 RC版で何も対策せずにビルドすると、勝手にTextFieldのタイトルのローカライズが適用されなくなります。

原因はSwiftUI3でTextFieldのイニシャライザに変更が加えられたことのようですが、ユーザ側で対処する方法は特にありません。TextField("foo" as LocalizedStringKey, text: $text)のように明示的にLocalizedStringKeyであることを記述する必要があります。必要なら専用のイニシャライザをextensionで定義するのが多少楽かもしれません。

これからAppを提出する場合、必ずTextFieldのイニシャライザが正しくLocalizedStringKeyを受け取っているかチェックしてください。

Discussion