Как создать представления в SwiftUI, используя коллекцию - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь найти способ вставить несколько массивов представлений в VStack в SwiftUI, используя оператор collect().

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.

1 Ответ

1 голос
/ 23 января 2020

Вы просто должны переставить вещи. Реальная проблема не в 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)
      }
  }

}
...