如何使用字符串变量定义LocalizedStringKey?编译超时问题求助
SwiftUI字符串变量转LocalizedStringKey的编译器超时问题解决
问题本质
直接用字符串字面量初始化LocalizedStringKey能正常工作,但用字符串数组元素赋值时,SwiftUI的ViewBuilder闭包(尤其是嵌套在ForEach里的局部变量场景)会让编译器类型推导压力过大,触发"The compiler is unable to type-check this expression in reasonable time"错误。
解决方法
有三种简单的修复方式,任选其一即可:
- 显式调用LocalizedStringKey初始化方法:不用依赖自动类型转换,直接通过初始化器把String转成LocalizedStringKey,减少编译器推导负担。
- 把数组定义移到ForEach外部:避免在闭包内部创建数组,降低闭包内的上下文复杂度,让编译器更容易处理类型推导。
- 直接定义LocalizedStringKey类型的数组:从根源上避免类型转换,直接使用目标类型的数组,让代码更简洁。
修复后的代码示例
方式一:显式初始化
var body: some View { ForEach(Array(stride(from: 0, to: 2, by: 1)), id: \.self) { index_v in let sPartList: [String] = ["ST", "MT", "LT"] // 显式调用初始化器 let test: LocalizedStringKey = LocalizedStringKey(sPartList[0]) HStack(alignment: .top) { Text("Hello") Text(test) } } }
方式二:数组移到外部
var body: some View { // 数组定义在ForEach外部 let sPartList: [String] = ["ST", "MT", "LT"] ForEach(Array(stride(from: 0, to: 2, by: 1)), id: \.self) { index_v in let test: LocalizedStringKey = LocalizedStringKey(sPartList[0]) HStack(alignment: .top) { Text("Hello") Text(test) } } }
方式三:直接用LocalizedStringKey数组
var body: some View { // 直接定义LocalizedStringKey类型的数组 let sPartList: [LocalizedStringKey] = ["ST", "MT", "LT"] ForEach(Array(stride(from: 0, to: 2, by: 1)), id: \.self) { index_v in let test = sPartList[0] HStack(alignment: .top) { Text("Hello") Text(test) } } }
内容的提问来源于stack exchange,提问作者DHHJ
相关产品推荐
相关产品推荐

