Xcode13中SwiftUI项目报编译器无法在合理时间内类型检查错误如何解决
报错原因
Xcode 13 升级后,Swift 编译器对 SwiftUI 视图构建的类型推断耗时限制更严格,你的 body 内嵌套了多层循环、条件判断、可选类型操作,编译器无法在限定时间内完成整体视图的类型推断,就会抛出这个错误。
修复方案
- 把视图中重复的 UnicodeScalar 转换、emoji 判断逻辑抽成单独的辅助函数,减少
body内的复杂表达式 - 提前计算好循环的范围值,不要在
ForEach参数内做实时运算 - 替换不安全的强制解包,改用可选绑定,同时降低编译器类型推断的复杂度
修改后可正常编译的完整代码
import SwiftUI struct EmojiView: View { var EmojiArr: [Int] = [0x1f601, 0x1f602, 0x1f603, 0x1f604, 0x1f605, 0x1f606, 0x1f607, 0x1f608, 0x1f609] func GetVstackNum(num: Int) -> Int { if num % 3 == 0 { return num / 3 } else { return num / 3 + 1 } } // 新增辅助函数:直接返回对应位置的Emoji Text视图 private func emojiText(for index: Int) -> Text { guard let scalar = UnicodeScalar(EmojiArr[index]), scalar.properties.isEmoji else { return Text("") } return Text(String(scalar)).font(.system(size: 17)) } var body: some View { HStack(spacing: 10) { let length = EmojiArr.count guard length > 0 else { return EmptyView() } // 提前计算循环上限 let rowCount = GetVstackNum(num: length) ForEach(0 ..< rowCount, id: \.self) { i in VStack(alignment: .leading, spacing: 22) { // 提前计算内层循环起止值,自动过滤超出数组长度的下标 let startIdx = 3 * i let endIdx = min(3 * i + 2, length - 1) ForEach(startIdx ... endIdx, id: \.self) { j in Button(action: { // 按钮点击逻辑 }) { emojiText(for: j) } .frame(width: 20, height: 10, alignment:.topLeading) .buttonStyle(PlainButtonStyle()) } } .frame(height: 83, alignment:.topLeading) } } } }
修改后所有复杂的计算和逻辑都从视图构建的 DSL 里抽离了,编译器不需要在推断视图类型的时候同时处理大量运算逻辑,就能顺利通过编译。
内容的提问来源于stack exchange,提问作者yo1nk
相关产品推荐
相关产品推荐

