在 swift 中的闭包内使用变量

Using a variable inside a closure in swift

这是我的 ContentView 代码:

import SwiftUI

struct GridStack<Content: View>: View {
    let rows: Int
    let columns: Int
    let content: (Character) -> Content

    var body: some View {
        VStack {
            ForEach(1 ..< rows, id: \.self) { row in
                HStack {
                    ForEach(1 ..< self.columns, id: \.self) { column in
                        self.content("C").padding().border(Color.black)
                    }
                }
            }
        }
    }

    init(rows: Int, columns: Int, @ViewBuilder content: @escaping (Character) -> Content) {
        self.rows = rows
        self.columns = columns
        self.content = content
    }
}

这是来自 SceneDelegate.swift

的片段
class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    let theSheet = ["A", "M", "A", "N"]
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let contentView = GridStack(rows: Int(11), columns: Int(11),  content: { _ in Text("\theSheet[3]")})
            
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }

具体请看行:

let contentView = GridStack(rows: Int(11), columns: Int(11),  content: { _ in Text(theSheet[3])})

您可以看到我已经将值 3 硬编码为数组 theSheet 的索引。我想做的是使用公式行+列中的当前“行”和“列”值动态计算索引。

请高手帮忙解答!我在线提供您需要的任何进一步详细信息。

如果我没有正确理解你的问题,我猜你想在 10*10 网格中显示数组中的一个字符。创建一个 ContentView 并从 ContentView:

调用 GridStack
struct ContentView: View {
    let theSheet = [YOUR_ARRAY]
    var body: some View {
       GridStack(rows: Int(10), columns: Int(10),  content: { index in
        Text(self.theSheet[index]).padding(8).border(Color.black).frame(width: 30)
       })
    }
}

GridStackreturn索引中,

  1. let content: (Character) -> Content替换为let content: (Int) -> Content
  2. self.content("C").padding().border(Color.black)替换为self.content((row*self.columns)+column)
  3. SceneDelegate 中将此 ContentView 称为 let contentView = ContentView()
  4. Return Int 而不是 GridStack
  5. 中的 Character

Calculated Index using (row*self.columns)+column

结果:https://i.stack.imgur.com/Qdcjg.png

我认为这不是使用闭包的好解决方案。 SwiftUI 意味着使用@State / @ObservableObject / @Environment 来改变内容。这是一个反应式编程。

例如,

struct GridStack<Content: View>: View {
    let rows: Int
    let columns: Int
    @ObservedObject var viewModel = ViewModel()

    var body: some View {
        let state = viewModel.state
        return VStack {
            ForEach(1 ..< rows, id: \.self) { row in
                HStack {
                    ForEach(1 ..< self.columns, id: \.self) { column in
                        Text("state: \([=10=])")
                    }
                }
            }
        }
    }

    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
    }
}