반응형
Notice
Recent Posts
Recent Comments
Link
Today
Total
07-20 14:02
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
관리 메뉴

iOS 개발 기록 블로그

[SwiftUI] 속성 래퍼(@State 등)와 일반 프로퍼티의 차이와 사용 방법 본문

iOS/SwiftUI

[SwiftUI] 속성 래퍼(@State 등)와 일반 프로퍼티의 차이와 사용 방법

crazydeer 2025. 6. 26. 15:41
반응형

@State, @ObservedObject, @EnvironmentObject 같은 속성 래퍼를 사용한 프로퍼티와

일반 프로퍼티(let 또는 var)로 선언되어 사용하는 것들의 차이점은 무엇일까?

 


 

🔍 일반 프로퍼티로 선언해서 사용하는 예시

public struct MyView: View {
  ...
  var someProperty: Bool

  public init(someProperty: Bool) {
    self.someProperty = someProperty
  }
이 구조는 SwiftUI에서 뷰 초기화 시 외부에서 값을 전달받고 이후 변경되지 않을 값을 받을 때 사용하는 일반적인 패턴입니다.

 


 

💡 왜 @State @Binding이 아니라 var인가요?

 

요약 정리

@State 내부에서 변경할 로컬 상태용. 뷰 안에서 수정 목적일 때 사용 ❌ 변경이 목적이 아님
@Binding 부모로부터 전달받은 양방향 바인딩 값. 값 변경이 가능하고 변경을 부모에게 전파해야 할 때 사용 ❌ 상위 뷰에 값을 다시 전달할 필요 없음
let 또는 var 외부에서 전달받고 뷰에서 읽기만 할 값. 변경되지 않거나 변경할 필요가 없는 고정된 설정용 ✅ 적합

 

 

일반 프로퍼티

  • 외부에서 한 번 전달받고,
  • 내부에서는 읽기 전용으로만 사용되고,
  • 값이 변하지 않으며, 다른 뷰로도 전달되지 않음.

위와 같은 경우에 사용합니다.

 


 

📌 예시로 비교해볼게요

struct ParentView: View {
  var body: some View {
    MyView(someProperty: true) // 전달
  }
}

이 경우 MyView는 단순히 그 값을 읽기만 하므로 var someProperty: Bool이면 충분한 거죠.

반대로 이런 경우는 속성 래퍼가 필요합니다:

 

 

@State

 예시:

@State private var count = 0

→ 뷰 내부에서 변경하면서 UI를 갱신해야 할 상태 값

 

 

@Binding

 예시:

struct ChildView: View {
  @Binding var isOn: Bool
}

→ 부모 뷰에서 전달하고 변경 결과도 다시 받아야 할 값

 


 

✅ 결론

 

일반 프로퍼티는

뷰가 생성될 때 한 번 초기화되고,
내부에서 변경하지 않으며,
외부와 상태 동기화가 필요 없는 단순 설정 값이기 때문에
속성 래퍼 없이 일반 프로퍼티로 선언된 것입니다.

 

이는 SwiftUI에서 의도적으로 그렇게 설계된 올바른 사용법입니다.

반응형