본문 바로가기

코딩의 유익함/스위프트(Swift)

SwiftUI - ContentView 구조 이해하기

SwiftUI ContentView

iOS 프로그래밍을 시작해보려고 하는데, 프로젝트 생성에 앞서 Storyboard와 SwiftUI를 선택하는 화면이 있더라고요. 그래서 이게 무엇인가 찾아보니 UI를 만드는데 어떤 방식을 채택할 것이냐 하는 문제더라고요.

 

그래서 검색을 해봤습니다. Stroyboard는 과거부터 현재까지 계속 사용하고 있는 방식이고, SwiftUI는 2019년 6월 즈음에 애플이 새롭게 출시한 UI 프레임워크더라고요. 저는 과감하게 새로운 것을 택하기로 했습니다.

 

새로운 SwiftUI를 선택한 이유는 애플이 새롭게 출시했다는 것은 강하게 추진한다는(?) 것이겠죠. 그래서  먼 미래에는 SwiftUI의 점유율이 높아질 것으로 예상되기 때문입니다. 물론 당분간은 Storyboard가 더 많겠지만요.

 

그림) Xcode 프로젝트 생성
그림) ContentView 구조

서론이 너무 길었습니다. 아무튼, 이렇게 프로젝트를 생성하고 나면 여러 파일들이 생성된 것을 볼 수 있는데요. 그중에 핵심으로 보이는 "ContentView.swift" 파일이 눈에 들어옵니다.

 

파일을 클릭해서 내용을 들여다보면, 처음 보시면 어리둥절할 수 있습니다. 특히 저같이 iOS 프로그래밍을 처음 하신다면 더더욱 그렇겠죠. 일단 struct 구조체가 눈에 들어옵니다. 그런데 View라는 것을 상속하고 있네요?

 

다른 언어에서 구조체는 상속할 수 없다고 하는데, Swift언어는 되는 것일까요? 프로토콜만 가능합니다.  저 View라는 것은 프로토콜이고 ContentView 구조체가 View 프로토콜을 구현하겠다고 하는 것입니다.

 

프로토콜을 간략하게 설명하면, 이를 구현하는 구조체나 클래스 등은 반드시 그 프로토콜이 가지고 있는 프로퍼티 등을 구현해야 한다는 것인데요. 이 View라는 프로토콜이라는 한번 것을 살펴볼까요?

그림) View 프로토콜

"associatedtype Body : View"가 먼저 보입니다. associatedtype은 기존 프로그래밍 언어에서는 typealias라고 사용하기도 했고, 과거 Swift에서도 그렇게 사용했었지만, 버전이 올라가면서 명칭이 바뀌었죠.

 

즉, 해석을 해보면 Body는 그 어떤 타입도 될 수 있지만, 그 타입은 반드시 View 프로토콜을 준수해야 한다는 것이죠. 이런 Body 타입의 프로퍼티 body를 ContentView에서는 구현해주어야 합니다.

 

또한, { get } 은 return 값을 가져야 하며, 그 반환형은 Body가 되는 것입니다. 앞에 붙은 @ViewBuilder은 여러 자식 뷰를 가질 수 있게 하기 위함인데, 여기서는 다루지 않고 나중에 따로 포스팅하겠습니다.

 

자, 그럼 View 프로토콜에 대해서 일부 알았으니 그림) "ContentView 구조"를 다시 살펴보면 body 프로퍼티는 "some View"라는 타입을 설정했네요. 그냥 View도 아니고 조금 이상하지요?

 

some은 불특정을 의미합니다. 즉 불특정 View라는 뜻으로 View 프로토콜을 준수하는 어떤 불특정 타입이라고 말할 수 있습니다. 이렇게 해놓은 이유는 간단하게 설명드리고 자세한 것은 역시 다음에 해보죠.

 

반환 타입이 연관 타입(associatedtype)이기 때문에 종류가 수없이 많아질 수 있고, 나열하기 어렵고, 또 그에 따라 가독성도 떨어지기 때문이라고 할 수 있습니다.

 

자 이제 다 왔습니다. 그렇다면 body 프로퍼티의 반환형은 어디에 나와있지요? return이 없는데 말이지요. Swift에서는 return을 생략할 수 있습니다. 반환형 타입이 프로퍼티  타입과 일치한다면 말이죠.

 

즉 그림) "ContentView 구조"에 보이는 Text("Hello, World!")의 반환 타입 역시 View 프로토콜을 준수하기 때문에 그 자체로 반환 값이 되어버립니다. 그리고 그 반환 값의 수식어(뷰의 함수 등)도 사용 가능합니다.

 

여기까지 정리를 해보았는데요, 저 역시 공부를 함과 동시에 적고 있는 내용이기에 조금 부족하거나 잘못 이해한 경우가 있을 수도 있으니 양해 부탁드리겠습니다. 읽어주셔서 감사합니다.