SwiftUI中无法在结构体属性区放for-in循环,如何正确初始化数组?
解决SwiftUI中数组初始化的问题
你在结构体属性区域直接写for循环是行不通的,Swift不允许在属性定义块内执行这类执行性代码。下面给你几种可行的初始化方式:
方法1:直接用数组字面量初始化(最简单)
既然数组内容是固定的,直接在声明时赋值即可:
@State private var pictureNameArray = ["image0", "image1", "image2", "image3", "image4"]
方法2:使用初始化器(init)动态生成
如果需要动态生成数组内容(比如数量不确定时),可以在结构体的初始化方法里填充数组:
struct ContentView: View { @State private var pictureNameArray = [String]() @State private var pictureNameArrayIndex1 = 0 @State private var pictureNameArrayIndex2 = 1 init() { // 初始化时填充数组,注意修正拼写错误(你写的imaage多了一个a) for i in 0...4 { pictureNameArray.append("image\(i)") } } // 其他代码不变... }
方法3:用闭包初始化计算属性(适合不需要修改的数组)
如果数组后续不需要修改,可以用let结合闭包初始化,无需使用@State:
let pictureNameArray: [String] = { var tempArray = [String]() for i in 0...4 { tempArray.append("image\(i)") } return tempArray }()
修正后的完整代码
这里采用方法1的简化方案,同时修正你代码里的拼写错误:
struct ContentView: View { // 直接初始化目标数组 @State private var pictureNameArray = ["image0", "image1", "image2", "image3", "image4"] @State private var pictureNameArrayIndex1 = 0 @State private var pictureNameArrayIndex2 = 1 func changePicture() { repeat { pictureNameArrayIndex1 = Int.random(in: 0 ... 4) pictureNameArrayIndex2 = Int.random(in: 0 ... 4) print(pictureNameArrayIndex1, pictureNameArrayIndex2) } while pictureNameArrayIndex1 == pictureNameArrayIndex2 } var body: some View { VStack { Label("Grand Son", systemImage: "sun.and.horizon.circle").font(.title) Image(pictureNameArray[pictureNameArrayIndex1]) .resizable() .aspectRatio(contentMode: .fit) .frame(width: 300, height: 200, alignment: .center) Image(pictureNameArray[pictureNameArrayIndex2]) .resizable() .aspectRatio(contentMode: .fit) .frame(width: 300, height: 200, alignment: .center) Button(action: changePicture) { Label("Push Here", systemImage: "arrow.up").font(.title) } } } }
内容的提问来源于stack exchange,提问作者Jaisung NOH MD
相关产品推荐
相关产品推荐

