है didSet पर @बाध्यकारी विशिष्ट फ़ाइल?

0

सवाल

अनिवार्य रूप से, मैं कर रहा हूँ घोंसले के शिकार @Binding 3 परतों गहरा है ।

struct LayerOne: View {
    @State private var doubleValue = 0.0
    
    var body: some View {
        LayerTwo(doubleValue: $doubleValue)
    }
}

struct LayerTwo: View {
    @Binding var doubleValue: Double {
        didSet {
            print(doubleValue)
        }
    }
    
    var body: some View {
        LayerThree(doubleValue: $doubleValue)
    }
}

struct LayerThree: View {
    @Binding var doubleValue: Double {
        didSet {
            print(doubleValue) // Only this print gets run when doubleValue is updated from this struct
        }
    }

    var body: Some view {
        // Button here changes doubleValue
    }
}

जो भी संरचना बदल doubleValue में से एक है, जहां didSet जाएगा चलाने के लिए मिलता है, तो उदाहरण के लिए अगर मैं इसे बदलने में LayerThree केवल एक है कि प्रिंट होगा, दूसरों से कोई भी होगा.

मैं कर रहा हूँ देखने के लिए के लिए परिवर्तन के साथ .onChange(of: doubleValue) जो होगा फिर चलाने के लिए मिलता है जब यह परिवर्तन, लेकिन यह नहीं कर रही है मुझे समझ में क्यों didSet रन नहीं मिलेगा सिवाय संरचना पर जहां यह से बदल दिया.

है @Binding संरचना विशिष्ट?

swift swiftui
2021-11-22 18:09:26
3

सबसे अच्छा जवाब

1

संपत्ति का उपयोग कर प्रेक्षकों की तरह didSet पर मूल्यों में लिपटे PropertyWrappers नहीं होगा "सामान्य" प्रभाव है, क्योंकि मूल्य स्थापित किया जा रहा है के अंदर आवरण.

में SwiftUI चाहते हैं, तो आप ट्रिगर करने के लिए एक कार्रवाई जब एक मूल्य में परिवर्तन, आप का उपयोग करना चाहिए onChange(of:perform:) संशोधक.

struct LayerTwo: View {
    @Binding var doubleValue: Double
    
    var body: some View {
        LayerThree(doubleValue: $doubleValue)
          .onChange(of: doubleValue) { newValue 
            print(newValue)
          }
    }
}
2021-11-22 18:26:49

पकड़ लिया, तो मैं बस की तरह सोचा था कि यह जा रहा है भीतर से सेट संरचना है कि यह सेट नहीं है, के माध्यम से श्रृंखला.
Joe Scotto
0

अब सभी काम कर रहे:

struct ContentView: View {
    
    var body: some View {
        
        LayerOne()
        
    }
    
}


struct LayerOne: View {
    
    @State private var doubleValue:Double = 0.0 {
        didSet {
            print("LayerOne:", doubleValue)
        }
    }
    
    var body: some View {
        LayerTwo(doubleValue: Binding(get: { return doubleValue }, set: { newValue in doubleValue = newValue } ))
    }
    
}

struct LayerTwo: View  {
    
    @Binding var doubleValue: Double {
        didSet {
            print("LayerTwo:", doubleValue)
        }
    }
    
    var body: some View {
        
        LayerThree(doubleValue: Binding(get: { return doubleValue }, set: { newValue in doubleValue = newValue } ))
    }
}




struct LayerThree: View  {
    
    @Binding var doubleValue: Double {
        didSet {
            print("LayerThree:", doubleValue) 
        }
    }
    
    var body: some View {
        
        Text(String(describing: doubleValue))
            
        Button("update value") {
            doubleValue = Double.random(in: 0.0...100.0)
        }
        .padding()
    }
    
}

प्रिंट परिणाम:

LayerOne: 64.58963263686678

LayerTwo: 64.58963263686678

LayerThree: 64.58963263686678

2021-11-22 18:20:58

लेकिन क्यों आप की जरूरत है पारित करने के लिए बाध्य है कि तरीका है? नहीं होना चाहिए didSet ट्रिगर की परवाह किए बिना, जहां बाध्यकारी बदल गया है?
Joe Scotto

मुझे लगता है कि हम नहीं पूछ सकते हैं क्यों या कैसे है, क्योंकि यह एप्पल और बंद स्रोत है । बनाने के लिए didSet काम शुरू आप की जरूरत है आरंभीकरण के लिए बाध्यकारी है ।
swiftPunk
0

देखने के लिए क्यों ऐसा होता है, हम अनावरण कर सकते हैं वाक्यात्मक चीनी की संपत्ति रैपर. @Binding var doubleValue: Double अनुवाद करने के लिए:

private var _doubleValue: Binding<Double>
var doubleValue: Double {
    get { _doubleValue.wrappedValue }
    set { _doubleValue.wrappedValue = newValue }
}

init(doubleValue: Binding<Double>) {
    _doubleValue = doubleValue
}

तुम जो भी करो में didSet डाल दिया जाएगा के बाद लाइन _doubleValue.wrappedValue = newValue. यह होना चाहिए बहुत स्पष्ट है क्यों, जब आप अद्यतन doubleValue में परत 3, didSet के doubleValue में परत 2 या 1 नहीं मिलता कहा जाता है । वे कर रहे हैं बस अलग अलग गणना के गुण!

swiftPunk के समाधान काम करता है बनाने के द्वारा एक नए बाध्यकारी जिसका सेटर सेट संरचना के doubleValueइसलिए , बुला didSet:

Binding(get: { return doubleValue }, 
        set: { newValue in doubleValue = newValue }
//                         ^^^^^^^^^^^^^^^^^^^^^^
//                         this will call didSet in the current layer
2021-11-22 18:37:59

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................