如何使用 collect 在 SwiftUI 中创建视图
How to create views in SwiftUI using collect
我正在尝试找出一种使用 collect()
运算符在 SwiftUI 的 VStack 中插入多个视图数组的方法。
struct ChatsTab: View {
var subscriptions = Set<AnyCancellable>()
var body: some View {
VStack {
["A", "B", "C", "D", "E"].publisher.collect(2).sink(receiveCompletion: { _ in
// Do nothing on completion
}) { (stringArray) in
HStack {
Text(stringArray[0])
Text(stringArray[1])
}
}
.store(in: &subscriptions)
}
}
}
但我收到以下错误:
Cannot convert value of type '()' to closure result type '_'
我只想对 collect
执行此操作,这样我就可以成对添加我的文本视图。我知道我还有其他选择,但我只想用 collect
完成它。
你只需要重新安排一下。真正的问题不是 collect
,而是您试图在 VStack
中执行任意代码。 VStack
是一个函数构建器,在它的大括号之间是一个视图列表,可能还有一些基本的 if
逻辑。不是任意代码,就像您在常规函数中包含的那种代码。
因此,如果您将发布者代码从 VStack 中取出,它将进行编译。你把它放在哪里取决于你,你可以把它放在 init()
中,从另一个函数调用,或者 int didAppear
视图修饰符(只是不直接在 VStack 中)。
第二个问题是收集将发布另一个数组(长度为 2 的数组)。您最终将得到一组 String 数组(或者您可以在它们发布时使用它们,而不是保留它们,具体取决于您要做什么)。您也可以使用更简单的 sink
版本,因为这里发布者的 Error
是 Never
。无论如何,这里有一些包含上述变化的东西:
import SwiftUI
import Combine
var subscriptions = Set<AnyCancellable>()
struct ContentView: View {
@State var stringArrays: [[String]] = []
var body: some View {
ForEach(stringArrays, id: \.self) { stringArray in
HStack {
Text(stringArray.count > 0 ? stringArray[0] : "")
Text(stringArray.count > 1 ? stringArray[1] : "")
}
}.onAppear() {
["A", "B", "C", "D", "E"].publisher
.collect(2)
.sink(receiveValue: { (stringArray) in
self.stringArrays.append(stringArray)
}).store(in: &subscriptions)
}
}
}
我正在尝试找出一种使用 collect()
运算符在 SwiftUI 的 VStack 中插入多个视图数组的方法。
struct ChatsTab: View {
var subscriptions = Set<AnyCancellable>()
var body: some View {
VStack {
["A", "B", "C", "D", "E"].publisher.collect(2).sink(receiveCompletion: { _ in
// Do nothing on completion
}) { (stringArray) in
HStack {
Text(stringArray[0])
Text(stringArray[1])
}
}
.store(in: &subscriptions)
}
}
}
但我收到以下错误:
Cannot convert value of type '()' to closure result type '_'
我只想对 collect
执行此操作,这样我就可以成对添加我的文本视图。我知道我还有其他选择,但我只想用 collect
完成它。
你只需要重新安排一下。真正的问题不是 collect
,而是您试图在 VStack
中执行任意代码。 VStack
是一个函数构建器,在它的大括号之间是一个视图列表,可能还有一些基本的 if
逻辑。不是任意代码,就像您在常规函数中包含的那种代码。
因此,如果您将发布者代码从 VStack 中取出,它将进行编译。你把它放在哪里取决于你,你可以把它放在 init()
中,从另一个函数调用,或者 int didAppear
视图修饰符(只是不直接在 VStack 中)。
第二个问题是收集将发布另一个数组(长度为 2 的数组)。您最终将得到一组 String 数组(或者您可以在它们发布时使用它们,而不是保留它们,具体取决于您要做什么)。您也可以使用更简单的 sink
版本,因为这里发布者的 Error
是 Never
。无论如何,这里有一些包含上述变化的东西:
import SwiftUI
import Combine
var subscriptions = Set<AnyCancellable>()
struct ContentView: View {
@State var stringArrays: [[String]] = []
var body: some View {
ForEach(stringArrays, id: \.self) { stringArray in
HStack {
Text(stringArray.count > 0 ? stringArray[0] : "")
Text(stringArray.count > 1 ? stringArray[1] : "")
}
}.onAppear() {
["A", "B", "C", "D", "E"].publisher
.collect(2)
.sink(receiveValue: { (stringArray) in
self.stringArrays.append(stringArray)
}).store(in: &subscriptions)
}
}
}