अरे! तुम इतने करीब थे। इसे आपको इसी तरह करना होगा। आपने एक डॉलर चिह्न (बीटा 3) या अंडरस्कोर (बीटा 4) को याद किया, और या तो अपनी राशि संपत्ति के सामने स्वयं, या राशि पैरामीटर के बाद .value। ये सभी विकल्प काम करते हैं:
आप देखेंगे कि मैंने @State
इनडेसिमल को हटा दिया , अंत में स्पष्टीकरण की जाँच करें।
यह संपत्ति का उपयोग कर रहा है (इसके सामने स्वयं को रखें):
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal = false
init(amount: Binding<Double>) {
self._amount = amount
self.includeDecimal = round(self.amount)-self.amount > 0
}
}
या का उपयोग कर। के बाद (लेकिन स्वयं के बिना, क्योंकि आप पारित पैरामीटर का उपयोग कर रहे हैं, न कि संरचना की संपत्ति):
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal = false
init(amount: Binding<Double>) {
self._amount = amount
self.includeDecimal = round(amount.value)-amount.value > 0
}
}
यह समान है, लेकिन हम पैरामीटर (withAmount) और संपत्ति (राशि) के लिए अलग-अलग नामों का उपयोग करते हैं, इसलिए आप स्पष्ट रूप से देखते हैं कि आप प्रत्येक का उपयोग कब कर रहे हैं।
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal = false
init(withAmount: Binding<Double>) {
self._amount = withAmount
self.includeDecimal = round(self.amount)-self.amount > 0
}
}
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal = false
init(withAmount: Binding<Double>) {
self._amount = withAmount
self.includeDecimal = round(withAmount.value)-withAmount.value > 0
}
}
ध्यान दें कि .value संपत्ति के साथ आवश्यक नहीं है, संपत्ति आवरण (@Binding) के लिए धन्यवाद, जो कि -value को अनावश्यक बनाने वाले एक्सेस को बनाता है। हालांकि, पैरामीटर के साथ, ऐसी कोई बात नहीं है और आपको इसे स्पष्ट रूप से करना होगा। यदि आप संपत्ति रैपर के बारे में अधिक जानना चाहते हैं, तो WWDC सत्र 415 की जाँच करें - आधुनिक स्विफ्ट एपीआई डिज़ाइन और 23:12 पर जाएं।
जैसा कि आपने खोजा था, initilizer से @State वैरिएबल को संशोधित करने से निम्नलिखित त्रुटि होगी: थ्रेड 1: घातक त्रुटि: View.body के बाहर स्टेट एक्सेस करना । इससे बचने के लिए, आपको या तो @ हटा देना चाहिए। जो समझ में आता है क्योंकि इनडिसिमल सत्य का स्रोत नहीं है। इसका मान राशि से लिया गया है। हालांकि @State को हटाकर, includeDecimal
राशि में परिवर्तन होने पर अपडेट नहीं होगा। इसे प्राप्त करने के लिए, सबसे अच्छा विकल्प, आपके शामिलकमल को एक गणना की गई संपत्ति के रूप में परिभाषित करना है, ताकि इसका मूल्य सत्य (राशि) के स्रोत से प्राप्त हो। इस तरह, जब भी राशि बदलती है, तो आपका शामिलडिमल भी करता है। यदि आपका दृश्य शामिल हैंDecimal पर निर्भर करता है, तो इसे बदलने पर अद्यतन करना चाहिए:
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal: Bool {
return round(amount)-amount > 0
}
init(withAmount: Binding<Double>) {
self.$amount = withAmount
}
var body: some View { ... }
}
जैसा कि रॉब मेयो द्वारा इंगित किया गया है , आप स्टेट वैरिएबल को इनिशियलाइज़ करने के लिए $$varName
(बीटा 3), या _varName
( बीटा 4) का उपयोग कर सकते हैं :
$$includeDecimal = State(initialValue: (round(amount.value) - amount.value) != 0)
_includeDecimal = State(initialValue: (round(amount.value) - amount.value) != 0)
self.includeDecimal = round(self.amount)-self.amount > 0
कीThread 1: Fatal error: Accessing State<Bool> outside View.body