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

問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章