🛑
[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