SwiftUI/SwiftUI 문법

[SwiftUI] SwiftUI 기본 구성 ContentView

hyunjuntyler 2023. 4. 26. 23:02

PlaygroundXcodeSwiftUI파일을 만들게 된다면 처음으로 보게 되는 화면이 있을 것이다. 바로 아래와 같은 화면이다.

struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
    }
}

 

항상 그냥 지나치지만 과연 이 코드들? 뭘까? 간단하게 뜯어보도록 하겠다.

struct ContentView: View

struct 키워드를 사용하여 구조체를 선언하고, ContentView라는 이름을 가지며, View 프로토콜을 따르는 타입이다. 벌써부터 복잡해진다. 구조체? 프로토콜? ContentView라는 이름을 가진다는 것 밖에 이해를 못 하겠다.

구조체 선언?

구조체란 Swift에서 데이터 타입을 정의하는 방법이다.

struct People {
    var name: String
    var age: Int
}

위와 같이 People 구조체는 nameage 라는 속성(property)을 가지는 데이터타입이다. 데이터타입이 감이 안 잡히면 묶음이라고 봐도 무방하다. 이제 위와 같이 People 을 사용하게 된다면 아래와 같이 사용할 수 있다.

let Kim = Person(name: "Kim", age: 25)
let Jeon = Person(name: "Jeon", age: 24)

그렇다면 struct ContentViewContentView 라는 묶음을 선언했구나! 정도로 쉽게 이해해 볼 수 있다.

View 프로토콜을 따르는 타입?

ContentView 라는 데이터타입을 선언했는데, 이 데이터 타입이 View 프로토콜(protocol)을 따르는 타입이라고? View 는 타입이면서도 body 라는 속성을 사용해야 한다는 특성이 있다. 프로토콜은 약속이라는 뜻이다. 따라서 View 를 쓴다는 것은 해당 뷰가 가져야 하는 규칙이나 약속을 정하는 것이다.

var body: some View

필수속성으로 필요한 body 속성(property)이 View 약속(protocol)을 따르는 어떤 뷰를 반환한다는 것을 나타낸다. 여기서 some 의 강력함이 나온다. 반환되는 뷰의 타입이 무엇인지 선언할 필요가 없다. 알아서 잘 맞춰줘!라는 의미이다. 만약 some 이 없다면 아래와 같이 Hello, World! 를 나타내는데 Text 라는 반환 타입을 지정해줘야 한다. 그렇게 되면 Text 말고 다른 것을 뷰에 넣으려면 또 다른 뷰를 선언해 줘야 한다.

struct ContentView: View {
    var body: Text {
        Text("Hello, World!")
    }
}

 

프로토콜인 View 는 무슨 약속을 할까?

View를 사용함으로써 다음과 같은 요구사항을 만족해야 한다.

1. 뷰는 코드가 컴파일될 때 생성 가능해야 한다.
2. 뷰는 상태를 가질 수 있어야 하고 사용자 입력에 따라 뷰의 상태를 업데이트할 수 있어야 한다.
3. 앱 전체에서 사용되는 색상이나 폰트와 같은 환경 변수에 뷰에서 액세스 하여 사용할 수 있어야 한다.

 

결론

아래와 같은 코드는 결국 ContentView 라는 묶음을 선언하고, var body 를 선언해서 어떠한 뷰를 보여줄거예요. 라는 뜻이다!

struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
    }
}