问题
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篇
- 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源码)》
- 《SwiftUI实战之TextField风格自定义与formatters》
- 《SwiftUI实战之TextField如何给键盘增加个返回按钮(隐藏键盘)》
- 《SwiftUI 当键盘出现时避免TextField被遮挡自动向上移动》
- 《SwiftUI实战之TextField如何给键盘增加个返回按钮(隐藏键盘)》
JSON文件篇
一篇文章系列
- SwiftUI一篇文章全面掌握List(教程和源码)
- 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源码)》
- SwiftUI一篇文章全面掌握Picker,解决数据选择(教程和源码)
- SwiftUI一篇文章全面掌握Form(教程和源码)
- SwiftUI Color 颜色一篇文章全解决
技术交流
QQ:3365059189
SwiftUI技术交流QQ群:518696470
- 请关注我的专栏icloudend, SwiftUI教程与源码
https://www.jianshu.com/c/7b3e3b671970