🛑
[SwiftUI] Xcode13 RC版ではTextFieldのローカライズ関連の破壊的変更に注意
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