티스토리 뷰

반응형

[1] @State

이니셜라이저에서 state를 초기화해주려면 underscore를 써서 접근해야한다. (출처)

struct SomeView: View {

    @State var selectedIndex: Int
    
    init() {
        let selectedInde = // do something
        _selectedIndex = State(initialValue: selectedIndex)
    }
    
    var body: some View {
        ... 
    }
}

 

[2] @Binding

바인딩도 마친가지이다. 이니셜라이저에서는 underscore를 써서 접근해야한다

struct SomeView: View {

    @Binding var someValue: Int
    
    init(someValue: Binding<Int>) {
        _someValue = someValue
    }
    
    
    var body: some View {
        ... 
    } 
}

 

[3] @EnvironmentObject

EnvironmentObject는 이니셜라이저에서 접근할 수 없다.

아래의 코드처럼 이니셜라이저에서 EnvironmentObject에 접근하려고 하면 

EnvironmentObject가 없다고 크래쉬가 난다. 

struct SomeView: View {
    
    @EnvironmentObject var someSettings: SomeSettings

    init() {
       print(someSettings)
    }
    
     var body: some View {
        ...
     }
}

 

그 이유는 아주 간단한데, (출처)

object 초기화가 끝난 다음에 EnvironmentObject를 inject해주기 때문이다. 

그래서 초기화 단계에서 EnvironmentObject에 접근하면 당연히 없다고 크래쉬가 난다. 

 

이니셜라이저에서 접근하지말고 플래그 둬서 onAppear해서 한번만 접근하게 해주는 등의 방법으로 대체할 수 있겠다-!

 

 

반응형
댓글