SwiftUI

[SwiftUI] ContentView 란 녀석의 특징 및 메서드 체이닝이란?

 

 


프로젝트를 생성하면 기본적으로 만들어지는 ContentView.swift파일의 코드 내용은 아래와 같습니다.

import SwiftUI

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

구조체는 상속받을 수 없는데 View를 상속받고 있는 것처럼 코딩되어 있음

Command 키를 누른 상태에서 View를 클릭하면 다음과 같은 코드 내용을 볼 수 있어요

기존의 UIView와 달리 프로토콜로 선언되어 있습니다.

@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public protocol View {

    /// The type of view representing the body of this view.
    ///
    /// When you create a custom view, Swift infers this type from your
    /// implementation of the required ``View/body-swift.property`` property.
    associatedtype Body : View

    /// The content and behavior of the view.
    ///
    /// When you implement a custom view, you must implement a computed
    /// `body` property to provide the content for your view. Return a view
    /// that's composed of primitive views that SwiftUI provides, plus other
    /// composite views that you've already defined:
    ///
    ///     struct MyView: View {
    ///         var body: some View {
    ///             Text("Hello, World!")
    ///         }
    ///     }
    ///
    /// For more information about composing views and a view hierarchy,
    /// see <doc:Declaring-a-Custom-View>.
    @ViewBuilder var body: Self.Body { get }
}

 

ContentView

  • class가 아닌 struct로 시작하는 구조체로 시작
  • SwiftUI에서는 화면을 구성하는 커스텀 뷰를 만들 때 반드시 이 뷰 프로토콜을 준수해야함.
  • 읽기전용인 body 연산프로퍼티만 필수로 구현하면 되는데 UIView클래스가 많은 수의 프로퍼티(사용목적과 관계없이 모든 프로퍼티를 보유하는 단점)를 가지는 것과 대조적임.
  • SwiftUI 프레임워크에서는 각각의 뷰 객체가 자신에게 필요한 속성만으로 뷰를 생성하다록 구현됨

 

SwiftUI 메서드 체이닝

다음 샘플 코드에서 처럼 보는 바와 같이 Text() 메서드 뒤에 font, multilineTextAlignment, foregroundColor등 연쇄적인 메서드 호출을 뜻합니다.

struct ContentView: View {
    var body: some View {
        
        VStack {
            Text("Hello, SwiftUI world!")
                .font(.title)
                .multilineTextAlignment(.center)
                .lineLimit(0)
                .padding()
                .foregroundColor(.green)
            HStack {
                Text(/*@START_MENU_TOKEN@*/"Placeholder"/*@END_MENU_TOKEN@*/)
                Spacer()
                Text("Merong~~~")
                    .font(.largeTitle)
            }
        }
    }
}

 

위 포스팅 내용들은 "스윗한 SwiftUI(이봉원 지음)" 전자책을 보고 스터디 및 실습한 내용들을 기록하였습니다.

 

 

Leave a Reply

error: Content is protected !!