Вы просто должны переставить вещи. Реальная проблема не в collect
, а в том, что вы пытаетесь выполнить произвольный код внутри VStack
. VStack
является построителем функций, и между его фигурными скобками идет список представлений и, возможно, только некоторые базовые c if
logi c. Не произвольный код, как тот, который вы включаете в обычную функцию. Так что, если вы возьмете код издателя из VStack, он скомпилируется. Где бы вы ни находились, это зависит от вас, вы можете иметь его в init()
, вызывать из другой функции или модификаторе представления int didAppear
(только не внутри VStack напрямую).
Вторая проблема заключается в том, что коллекция опубликует sh другой массив (один длиной 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)
}
}
}