은 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 in layer3, didSetdoubleValue 레이어 또는 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ý
..................................................................................................................