* 이 글은 작성자의 학습을 위하여 작성된 글입니다.
개발자는 animal이라는 변수를 통해 중앙의 Text를 바꾸고 싶습니다.
우선, 변경 버튼을 누르면 토끼라는 텍스트를 사자로 바꾸려합니다.
Button의 클로저 영역에 버튼을 눌렀을 때, animal 변수의 값을 "사자"로 바꾸자고 생각합니다.
개발자는 너무 당연하게 animal = "사자" 라고 코드를 작성합니다.
어라! 에러메세지가 발생합니다.
왜 안될까요?
가장 먼저 에러메세지를 읽어봅니다.
self가 불변이다. 여기서 self는 ContentView 입니다.
ContentView가 불변이라는 뜻이겠군요.
왜 ContentView가 불변이라는 걸까요?
ContentView에 대해 들여다 볼 시간입니다.
ContentView는 View 프토토콜을 채택하는 구조체(Struct) 입니다.
View 프로토콜은 어떤 규칙을 요구하고 있을까요?
View를 반환하는 body라는 연산 프로퍼티를 요구하고 있습니다!
그런데 속성을 보니 { get } 만 명시되어 있고, { set } 은 명시되어 있지 않습니다.
get은 프로퍼티의 접근자(accessors)로 프로퍼티의 현재 값을 얻을 수 있고,
set은 설정자(mutators)로 새로운 값을 프로퍼티에 할당할 수 있습니다.
body는 구조체 안의 View를 반환하는 연산 프로퍼티 입니다.
이 연산 프로퍼티는 View 프로토콜의 규칙에 의해 { get } 만을 하도록 되어,
animal 변수를 body 안에서 변경하는 건 불가능함을 이해할 수 있습니다.
그럼 정말 변수를 바꿀 수 없는 걸까요?
해당 상태를 관리할 수 있는 프로퍼티 래퍼인 @State를 사용해야 합니다.
성공적으로 작동합니다
[참고] https://docs.swift.org/swift-book/documentation/the-swift-programming-language/
'iOS > SwiftUI' 카테고리의 다른 글
[SwiftUI] some View에 대해서, some과 Opaque Type (0) | 2024.04.16 |
---|---|
[SwiftUI] SwiftUI를 소개합니다. (0) | 2024.04.15 |
[SwiftUI] Custom Font 추가와 Font Extension하기 (0) | 2023.11.25 |
[Udemy : SwiftUI+SwiftData Masterclass] Section 10. AFRICA (0) | 2023.11.08 |
[Day 9] 클로저(Closure), passing functions into functions (0) | 2023.08.11 |