ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] - mutating
    iOS/SWIFT 2024. 2. 6. 15:08
    728x90
    반응형

    오늘은 mutating에 대해서 포스팅 해보겠다.

     

    SwiftUI의 경우에는 보통 @State, @Binding, @EnvironmentObject 등등 속성래퍼를 사용하여 뷰의 상태를 관리한다.

    하지만 그런것들을 쓰지 않는 UIkit의 경우 어떨까?

     

    mutating은 함수나 클로져 내에서 해당 구조체나 열거형 내의 인스턴스 프로퍼티를 변경하려 할때 사용된다.

    구조체나 열거형은 값 타입이므로 인스턴스의 프로퍼티를 변경하려면 메서드도 해당 인스턴스를 변경 가능하도록 선언되어야 한다.

    이때 메서드 선언 앞에 mutating 키워드를 사용하여 해당 메서드가 해당 인스턴스를 변경할 수 있음을 나타낸다.

     

    구조체 사용을 예시를 들어보자

    struct MyStruct:Struct {
        var myProperty: Int
        
        mutating func updateProperty(newValue: Int) {
            myProperty = newValue
        }
    }
    
    var myInstance = MyStruct(myProperty: 5)
    myInstance.updateProperty(newValue: 10)
    print(myInstance.myProperty) // 출력: 10

    위에서 언급한대로 구조체는 값타입이기 때문에 프로퍼티를 변경하려면 따로 조치를 취해줘야하는데 값을 바꾸려는 메서드에 mutating 키워드를 사용하면 위와 같이 값을 변경할 수 있다.

     

     

    그렇다면 만약에 SwiftUI에서도 이런식으로 관리될까?

    결론부터 얘기하자면 아니다. SwiftUI는 뷰와 데이터 사이의 관리는 데이터 바인딩으로 연결이 되어있어 상태를 감지하는 프로퍼티 속성래퍼를 사용한다.

     

    위에서 언급한 @State, @Binding, @EnvironmentObject등이 이에 속한다.

    그럼 SwiftUI를 예로 들어보자

    struct ContentView: View {
        @State var myProperty: Int = 5
        
        var body: some View {
            VStack {
                Text("My Property: \(myProperty)")
                Button("Increment") {
                    myProperty += 1 // 이곳에서 직접 속성을 변경 가능
                }
            }
        }
    }

     

    Button (클로져) 내부에서 해당 구조체(View프로토콜은 struct로 정의됨)의 프로퍼티를 변경하려고 한다. 이때 프로퍼티 쪽에서 @State라는 속성래퍼를 사용하여 상태를 감지할 수 있는 변수를 만들어줘서 프로퍼티 값을 변경할 수 있도록 한다.

     

    물론 Uikit의 대부분의 데이터 타입은 클래스로 이루어져 있어 사용할 일이 드물지만, DTO 클래스나 프로토콜등을 사용하면서 언제든 구조체 내부 프로퍼티를 변경할 일이 생길 것이다. 그럴때를 위해 약소한 내용이긴 하지만 이런게 있다정도는 확인하자.

Designed by Tistory.