반응형

 

Hacking with Swift 사이트의 강좌 번역본입니다.

 

[원문 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-fix-modifying-state-during-view-update-this-will-cause-undefined-behavior]

 

How to fix “Modifying state during view update, this will cause undefined behavior”

 

해당 오류는 뷰가 실제적으로 그리는 도중에 SwiftUI의 상태를 수정하기 때문에 발생합니다. 뷰의 상태를 수정하면 뷰는 다시 그려지므로, SwiftUI는 혼란스러워 합니다 - 정의되지 않은 행동(undefined behavior)은 Apple 방식대로는 지금 보고 있는 것이 무엇이든간에 SwiftUI로 사용되는 방법이 아니기 때문에, 나중에는 변경할 수도 있다는 것입니다. 

 

다음은 문제가 되는 동작의 예제입니다.

struct ContentView: View {
    @State private var name = ""

    var body: some View {
        if name.isEmpty {
            name = "Anonymous"
        }

        return Text("Hello, \(name)!")
    }
}

 

name라는 상태 프로퍼티를 만들고, 이를 보여주는 텍스트 뷰를 가지고 있습니다. 하지만 body 내부에는 뷰가 그려지는 동안에 name을 수정하려는 로직이 있습니다 - SwiftUI는 뷰에 무엇이 있는지 확인하려 하고, 이게 진행되는 동안에 변경하고 있습니다.

 

이 문제를 고치려면, 뷰의 상태를 변경하는 코드를(이 경우에 name = Anonymous) 뷰를 업데이트하는 바깥쪽으로 옮겨야 합니다. 예를들어, 다음은 텍스트 뷰가 처음 나타날때 값을 설정합니다.

struct ContentView: View {
    @State var name = ""

    var body: some View {
        Text("Hello, \(name)!")
            .onAppear {
                if self.name.isEmpty {
                    self.name = "Anonymous"
                }
            }
    }
}

 

또한 해당 로직을 onTapGesture()이나 비슷한 곳으로 옮길 수 있습니다 - 뷰의 본문(body) 내부에 직접 있지 않는 어딘가

반응형
Posted by 까칠코더
,