SwiftUI 的 The compiler is unable to type-check this expression in reasonable time 問題

撰寫 SwiftUI 程式時,有時我們會遇到奇怪的問題,比方像以下的程式,明明語法沒錯,但 Xcode 卻無法理解,顯示錯誤訊息 The compiler is unable to type-check this expression in reasonable time。

struct ContentView: View {
var body: some View {
List(0..<100) { (number) in
if number % 3 == 0 || number % 5 == 0 {
Text("number \(number) 是 3 或 5 的倍數")
} else {
Text("number \(number) 不是 3 或 5 的倍數")
}
}
}
}

一般遇到這樣的問題,我們可以試著以下兩種解法修正

解法 1: 將某些複雜的程式另外包成 function

剛剛程式的 if number % 3 == 0 || number % 5 == 0 太複雜了,造成紅色錯誤。我們只要另外將它包含成 function,即可修正此問題。

struct ContentView: View {
func check(number: Int) -> Bool {
number % 3 == 0 || number % 5 == 0
}

var body: some View {
List(0..<100) { (number) in
if self.check(number: number) {
Text("number \(number) 是 3 或 5 的倍數")
} else {
Text("number \(number) 不是 3 或 5 的倍數")
}
}
}
}

解法 2: 用 extract subview 將 ForEach 或 List { } 裡的東西另外包成獨立的型別

讓我們再看另一個例子。

VStack {   ForEach(0..<100/2+1) { (index) in      HStack {         if index % 2 == 0 {            Image("peter")         } else {            Image("hook")         }      }   }}

由於 ForEach(0..<100/2+1) 的數學太複雜了,所以產生紅色錯誤。

我們可以將 ForEach 裡的 HStack 另外包成獨立的型別,幫助人類跟 Xcode 更容易理解程式,如此即可修正錯誤。

struct ContentView: View {   var body: some View {      VStack {         ForEach(0..<100/2+1) { (index) in            DemoImage(index: index)         }      }   }}struct DemoImage: View {   var index: Int   var body: some View {      HStack {         if index % 2 == 0 {            Image("peter")         } else {            Image("hook")         }      }   }}

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store