如何解决快速在闭包内部使用变量
这是我的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),content: { _ in Text(theSheet[3])})
您可以看到我已经为数组theSheet的索引硬编码了值3。我想做的是使用公式行+列中的当前“行”和“列”值动态计算索引。
我请这里的专家提供帮助!我在线上提供您需要的更多详细信息。
解决方法
如果我正确理解了您的问题,我想您想在10 * 10网格中显示数组中的字符。创建一个ContentView
并从GridStack
调用ContentView
:
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)
})
}
}
在GridStack
中返回索引,
- 将
let content: (Character) -> Content
替换为let content: (Int) -> Content
- 将
self.content("C").padding().border(Color.black)
替换为self.content((row*self.columns)+column)
- 在
ContentView
中将此SceneDelegate
称为let contentView = ContentView()
- 在您的
Int
中返回Character
而不是GridStack
使用
计算得出的索引(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: \($0)")
}
}
}
}
}
init(rows: Int,columns: Int) {
self.rows = rows
self.columns = columns
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。