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

Swift中if语句语法错误引发编译超时,请求代码排查

问题:LazyVGrid内条件设置字体导致编译缓慢及类型检查失败

我用Xcode开发应用,在LazyVGrid的ForEach循环里创建了多个按钮。为了让其中一个按钮("Carry")使用不同字号,添加了if else语句,结果Xcode编译变得极慢,SourceKitService占用大量CPU资源,之前代码运行完全正常。同时收到编译器错误提示:
The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions.

原代码如下:

var text: String
let columns = [
GridItem(.flexible(), spacing: 0),
GridItem(.flexible(), spacing: 0),
GridItem(.flexible(), spacing: 0),
GridItem(.flexible(), spacing: 0),
GridItem(.flexible(), spacing: 0),
GridItem(.flexible(), spacing: 0)]
let numbers = ["+", "-", "x", "÷", "=", "Carry", "(", ")", "%", "<", ">", "Borrow", "0", "1", "2", "3", "4", ",", "5", "6", "7", "8", "9", "."] 
LazyVGrid(columns: columns, spacing: 0) {
            ForEach(numbers, id: \.self) { number in
                Button(action: {
                    text += number
                }) {
                    ZStack {
                    Rectangle()
                        .frame(width: g.size.width/6, height: g.size.height/2)
                        .foregroundColor(.white)
                        .border(.gray, width: 1)
                        Text(number)
                        if (number = "Carry") {
                            .font(.system(size: g.size.width/40))
                        } else {
                            .font(.system(size: g.size.width/20))
                        }
                            .foregroundColor(.black)
                    }
                }
                .buttonStyle(.borderless)
            }
        }

问题原因分析

你的代码存在两处关键问题,直接导致了编译缓慢和类型检查失败:

  1. 语法错误:if (number = "Carry") 使用了赋值运算符=,正确的相等判断应该用==
  2. SwiftUI链式调用结构破坏:你把if else分支直接插入到Text(number)的修饰符链中,这种写法让Swift编译器无法快速推断视图的类型,被迫进行大量复杂的类型推导,最终导致编译超时。

修复方案

方案1:提前计算字体大小(简单直接)

把字体大小的条件判断提前计算,再传入font修饰符,保持链式调用的完整性:

var text: String
let columns = [
    GridItem(.flexible(), spacing: 0),
    GridItem(.flexible(), spacing: 0),
    GridItem(.flexible(), spacing: 0),
    GridItem(.flexible(), spacing: 0),
    GridItem(.flexible(), spacing: 0),
    GridItem(.flexible(), spacing: 0)
]
let numbers = ["+", "-", "x", "÷", "=", "Carry", "(", ")", "%", "<", ">", "Borrow", "0", "1", "2", "3", "4", ",", "5", "6", "7", "8", "9", "."] 

LazyVGrid(columns: columns, spacing: 0) {
    ForEach(numbers, id: \.self) { number in
        Button(action: {
            text += number
        }) {
            ZStack {
                Rectangle()
                    .frame(width: g.size.width/6, height: g.size.height/2)
                    .foregroundColor(.white)
                    .border(.gray, width: 1)
                
                // 提前计算字体大小,避免破坏链式调用
                let fontSize = number == "Carry" ? g.size.width/40 : g.size.width/20
                Text(number)
                    .font(.system(size: fontSize))
                    .foregroundColor(.black)
            }
        }
        .buttonStyle(.borderless)
    }
}

方案2:拆分为独立子视图(适合复杂场景)

如果后续需要给按钮添加更多复杂逻辑,建议将按钮内容拆分为独立子视图,进一步简化编译器的类型推导:

// 定义独立的按钮标签子视图
struct NumberButtonLabel: View {
    let number: String
    let fontSize: CGFloat
    let screenSize: CGSize // 传递屏幕尺寸,避免直接捕获外部的GeometryProxy
    
    var body: some View {
        ZStack {
            Rectangle()
                .frame(width: screenSize.width/6, height: screenSize.height/2)
                .foregroundColor(.white)
                .border(.gray, width: 1)
            Text(number)
                .font(.system(size: fontSize))
                .foregroundColor(.black)
        }
    }
}

// 主视图中使用
LazyVGrid(columns: columns, spacing: 0) {
    ForEach(numbers, id: \.self) { number in
        Button(action: {
            text += number
        }) {
            NumberButtonLabel(
                number: number,
                fontSize: number == "Carry" ? g.size.width/40 : g.size.width/20,
                screenSize: g.size
            )
        }
        .buttonStyle(.borderless)
    }
}

修复后,编译器能快速完成类型检查,编译速度会恢复正常,同时解决报错问题。另外注意确保g是通过GeometryReader获取的有效GeometryProxy实例。

内容的提问来源于stack exchange,提问作者Churro the Duck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:45:33