मैं स्विफ्ट में एक बंधन के अंदर एक वैकल्पिक मूल्य को कैसे खोल सकता हूं?


9

मैं SwiftUI का उपयोग करके एक ऐप बना रहा हूं और इसे a Binding<Value?>से a में कन्वर्ट करने का तरीका चाहूंगा Binding<Value

मेरे ऐप में मेरे पास एक ऐसा है AvatarViewजो किसी विशेष उपयोगकर्ता के लिए एक छवि प्रदान करना जानता है।

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

मेरा ऐप एक ContentViewऐसा खाता है जो दो बाइंडिंग का मालिक है: आईडी द्वारा उपयोगकर्ताओं का एक शब्दकोश, और उपयोगकर्ता का आईडी जिसका अवतार हम दिखा रहे हैं।

struct ContentView: View {
  @State var userById: Dictionary<Int, UserData>
  @State var activeUserId: Int

  var body: some View {
    AvatarView(userData: $userById[activeUserId])
  }
}

समस्या: उपरोक्त कोड गठबंधन नहीं करता है क्योंकि $userById[activeUserId]यह प्रकार Binding<UserData?>का AvatarViewहोता है और इसमें लेता है Binding<UserData>

जिन चीजों की मैंने कोशिश की ...

  • $userById[activeUserId]!काम नहीं करता क्योंकि यह एक को खोलना नहीं है Binding<UserData?>। आप केवल एक को खोल सकते हैं Optional, ए को नहीं Binding<Optional>

  • $(userById[activeUserId]!)उन कारणों के लिए काम नहीं करता है जो मुझे अभी तक समझ में नहीं आए हैं, लेकिन मुझे लगता है कि कुछ के बारे $में संकलन समय पर हल किया जाता है ताकि आप मनमाने ढंग से अभिव्यक्तियों को उपसर्ग न कर सकें $


क्या आपने कोशिश की $userById[activeUserId] as! Binding<UserData>?
कामरान

सलाह के लिये धन्यवाद! मुझे लगता है कि यह शायद ठीक काम करेगा, लेकिन मैं एक असुरक्षित कास्ट नहीं करना पसंद करूंगा। जब मैं इसे
आज़माता

जवाबों:


11

आप इस आरंभीकरण का उपयोग कर सकते हैं , जो इस सटीक मामले को संभालने के लिए लगता है - परिवर्तित Binding<T?>करना Binding<T>?:

var body: some View {
    AvatarView(userData: Binding($userById[activeUserId])!)
}

मैंने !आपके प्रयासों की तरह ही अनट्रैप करने के लिए मजबूर किया है, लेकिन आप जो nilचाहते हैं , उसे अनचेक कर सकते हैं। अभिव्यक्ति Binding($userById[activeUserId])प्रकार की है Binding<UserData>?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.