当前位置: 首页 > 工具软件 > Macaw > 使用案例 >

SwiftUI Macaw 如何修复Expression was too complex to be solved in reasonable time

龙浩博
2023-12-01

问题

Expression was too complex to be solved in reasonable time

解决方案

Swift对类型推断的使用使我们的代码更短,更易于阅读,但同时也占用了大量CPU时间。 有时,值可能是几种类型之一,如果它与可能是几种类型之一的另一种东西一起使用,那么Swift要做的工作量就会成倍增加。 如果Swift遇到的可能性太多,以至于大约15秒后根本无法弄清,它就会抛出错误:“表达太复杂,无法在合理的时间内解决; 考虑将表达式分成不同的子表达式。”

Swift团队正在努力为每个新版本的Swift进行改进,并且编译器何时会抛出此错误没有真正的固定界限。 幸运的是,此错误消息告诉您要解决此问题的确切方法:将表达式分成多个子表达式。

例如,这种代码在现代Mac上编译几乎需要2秒钟:

let sum = [1, 2, 3].map { String($0) }.compactMap { Int($0) }.reduce(0, +)

在较旧的Mac上,Swift确实很挣扎,因此,明智的做法是将其分解为多个子表达式,如下所示:

let numbers = [1, 2, 3]
let stringNumbers = numbers.map { String($0) }
let intNumbers = stringNumbers.flatMap { Int($0) }
let sum = intNumbers.reduce(0, +)

修复Macawbug

问题代码

    let a = { i in
        m1[i] + c * m2[i] + s * m3[i]
    }

修复后

  /*
    let a = { i in
        m1[i] + c * m2[i] + s * m3[i]
    }
*/
self.init(values: [
acal(i:0, m1: m1, c: c, m2: m2, s: s, m3: m3),
acal(i:1, m1: m1, c: c, m2: m2, s: s, m3: m3),
acal(i:2, m1: m1, c: c, m2: m2, s: s, m3: m3),
0,
0,
acal(i:3, m1: m1, c: c, m2: m2, s: s, m3: m3),
acal(i:4, m1: m1, c: c, m2: m2, s: s, m3: m3),
acal(i:5, m1: m1, c: c, m2: m2, s: s, m3: m3),
0, 0,
acal(i:6, m1: m1, c: c, m2: m2, s: s, m3: m3),
acal(i:7, m1: m1, c: c, m2: m2, s: s, m3: m3),
acal(i:8, m1: m1, c: c, m2: m2, s: s, m3: m3),
0, 0,0, 0, 0, 1, 0])
}

}

func acal(i:Int,m1:[Double],c:Double,m2:[Double],s:Double,m3:[Double]) -> Double {
return m1[i] + c * m2[i] + s * m3[i]

}

推荐

基础文章推荐

经典教程推荐

上新

技术源码推荐

推荐文章

CoreData篇

Combine篇

TextField篇

JSON文件篇


一篇文章系列

技术交流

QQ:3365059189
SwiftUI技术交流QQ群:518696470

 类似资料: