मैं 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 के साथ करना चाहता हूं।

0
Fateh 23 जिंदा 2020, 17:23

1 उत्तर

सबसे बढ़िया उत्तर

आपको बस चीजों को पुनर्व्यवस्थित करना है। असली मुद्दा collect नहीं है, मुद्दा यह है कि आप VStack के अंदर मनमाना कोड निष्पादित करने का प्रयास कर रहे हैं। VStack एक फंक्शन बिल्डर है और इसके घुंघराले ब्रेसिज़ के बीच विचारों की एक सूची और संभवतः कुछ बुनियादी if तर्क हैं। मनमाना कोड नहीं, जैसा कि आप नियमित फ़ंक्शन में शामिल करते हैं। इसलिए यदि आप प्रकाशक कोड को VStack से बाहर निकालते हैं तो यह संकलित हो जाएगा। आप इसे कहां रखते हैं, यह आप पर निर्भर है, आप इसे init() में रख सकते हैं, जिसे किसी अन्य फ़ंक्शन से कहा जाता है, या int didAppear संशोधक देखें (सिर्फ सीधे VStack के अंदर नहीं)।

दूसरा मुद्दा यह है कि संग्रह एक और सरणी (लंबाई 2 में से एक) प्रकाशित करेगा। आप अनिवार्य रूप से स्ट्रिंग सरणी की एक सरणी के साथ समाप्त हो जाएंगे (या आप उन्हें प्रकाशित होने के साथ ही उपभोग कर सकते हैं और आप जो करने की कोशिश कर रहे हैं उसके आधार पर उन्हें आसपास नहीं रख सकते हैं)। आप 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)
      }
  }

}
1
Cenk Bilgen 23 जिंदा 2020, 15:03