You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用字符串变量定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:37:27