본문 바로가기
Swift

프로퍼티 래퍼(Property Wrapper)

by JDeoks 2023. 5. 3.

Swift에서 프로퍼티 래퍼(Property Wrapper)는 속성을 래핑하여 이를 관리하거나 추가 기능을 제공하는 데 사용된다.

주로 코드의 가독성과 재사용성을 향상시키는 데에 유용하며, 중복된 코드를 줄이고 프로퍼티에 대한 일관된 인터페이스를 제공하는 데 도움이 된다.

그 중 몇 가지를 정리해보려고 한다.

1. @State

SwiftUI에서 사용되며, 상태 값의 변화를 감지하고 이에 따라 뷰를 다시 그리는 데 사용된다.

struct ContentView: View {
    @State var count = 0
    
    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increase Count") {
                count += 1
            }
        }
    }
}

count라는 상태 값을 선언하고, 이를 이용해 뷰를 그린다. 버튼을 누르면 count 값이 1 증가하며, 이에 따라 뷰가 다시 그려진다.

 

2. @Binding

@Binding 프로퍼티 래퍼는 변수나 상수가 아닌, 다른 뷰나 모델 등의 값을 바인딩하도록 하는 래퍼이다.

SwiftUI에서 사용되며, 상위 뷰에서 하위 뷰로 데이터를 전달하는 데 사용된다. 하위 뷰에서 변경된 값이 상위 뷰에서 바로 반영된다.

struct ContentView: View {
    @State var count = 0
    
    var body: some View {
        VStack {
            Text("Count: \(count)")
            ChildView(count: $count)
        }
    }
}

struct ChildView: View {
    @Binding var count: Int
    
    var body: some View {
        Button("Increase Count") {
            count += 1
        }
    }
}

ContentView에서는 count라는 상태 값을 선언하고, 이를 ChildView로 전달한다. ChildView에서 @Binding 프로퍼티 래퍼를 사용하여 count 값을 전달받고, 버튼을 누르면 count 값은 증가한다. 이 때 ContentView에서도 count 값이 변경되므로, 해당 값이 증가한 내용이 화면에 반영된다.

상위 뷰에서 하위뷰로 값을 전달할 때 $count형태로 전달하게 되는데, $count는 count 값을 래핑하여 Binding<Int> 형태로 전달하는 것이다. Binding<Int> 타입은 Int 값의 래퍼로, 해당 값이 변경될 때마다 자동으로 뷰를 업데이트한다.  포인터를 전달하는 방식과 유사하다.

 

3. @Published

 

4. @ObservedObject

SwiftUI에서 사용되며, 다른 객체의 상태 변화를 감지하여 이에 따라 뷰를 다시 그리는 데 사용된다.

class ViewModel: ObservableObject {
    @Published var count = 0
    
    func increaseCount() {
        count += 1
    }
}

struct ContentView: View {
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View {
        VStack {
            Text("Count: \(viewModel.count)")
            Button("Increase Count") {
                viewModel.increaseCount()
            }
        }
    }
}

 

'Swift' 카테고리의 다른 글

화면 전환  (0) 2023.06.29
제네릭(Generic), where 키워드  (0) 2023.05.03
타입 메서드 (Type method)  (0) 2023.05.01
SwiftUI에서 UIImagePickerController 사용  (0) 2023.05.01
GeometryReader, Gesture, AVAudioPlayer로 진동 구현 OE - 2  (0) 2023.05.01