在 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)
})
}
}
在GridStack
return索引中,
- 将
let content: (Character) -> Content
替换为let content: (Int) -> Content
- 将
self.content("C").padding().border(Color.black)
替换为self.content((row*self.columns)+column)
- 在
SceneDelegate
中将此 ContentView
称为 let contentView = ContentView()
- Return
Int
而不是 GridStack
中的 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
}
}
这是我的 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)
})
}
}
在GridStack
return索引中,
- 将
let content: (Character) -> Content
替换为let content: (Int) -> Content
- 将
self.content("C").padding().border(Color.black)
替换为self.content((row*self.columns)+column)
- 在
SceneDelegate
中将此ContentView
称为let contentView = ContentView()
- Return
Int
而不是GridStack
中的
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
}
}