Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Today
Total
관리 메뉴

teunteun2

SwiftUI 나를 위한 wiki(1) - App, Scene, View 본문

SwiftUI

SwiftUI 나를 위한 wiki(1) - App, Scene, View

teunteun2 2023. 8. 1. 12:20

 

 

[SwiftUI OverView]

 

SwiftUI는 앱 UI를 declaring 하기 위한 views, controls, 그리고 layout 구조물을 제공한다.

1. App 프로토콜을 통해 앱 구조를 만든다

2. View 프로토콜을 통해 뷰를 구성한다

3. 뷰에 Modifiers를 적용해 커스텀한다

 

SwiftUI는 선언형UI 이기에 Declare라는 말이 자주 등장한다.

 

 

 

[App - protocol]

앱의 구조와 행동을 나타내는 타입

 

1. 먼저 @main 을 통해 앱의 엔트리포인트를 선언해준다.

 

2. 다음으로 앱의 content를 정의하기 위해선 필수적으로 요구되는 body라는 연산프로퍼티를 구현해야한다

body 는 some 이라는 opaquetypes를 통해 리턴타입을 불분명하게 두고 있다.
 -> Scene 프로토콜을 준수하는 인스턴스는 모두 반환 가능하도록

 

3. App Protocol은 앱을 실행하기 위한 시스템을 호출하는 main()이라는 메서드의 default implementation을 제공해준다

 

@main
struct Mail: App {
    var body: some Scene {
        WindowGroup {
            MailViewer()
        }
        Settings {
            SettingsView()
        }
    }
}

 

body - computed property

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 built-in views that SwiftUI provides, plus other
    /// composite views that you've already defined
    @ViewBuilder @MainActor var body: Self.Body { get }
}

opaquetypes

opaquetype은 some + protocol 로 작성한다.

SwiftUI에서는 body 연산프로퍼티가 protocoltype을 준수하는 것이 아닌 some을 통해 opquetype을 준수하는 것을 흔히 볼 수 있다.

opaquetype을 통해 body 내부에서는 some 뒤에 오는 protocol을 준수하는 인스턴스라면

모두 리턴할 수 있도록 불분명하게 만들어놓는다.

하지만 opaquetype을 준수하면 리턴타입은 항상 하나여야한다

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/opaquetypes/

 

Documentation

 

docs.swift.org

정의 : Hide implementation details about a value’s type

 

 

default implementation

보통 프로토콜은 메서드를 구현하지 않고, 채택할 부분에서 프로토콜을 채택 후 기능을 구현하는데,

특정 프로토콜을 준수하는 모든곳에서 공통으로 사용되어야할 기능이 있다면, default implementation을 사용한다.

default implementation은 프로토콜 extension에서 메서드 기능을 구현할 수 있도록 한다.

SwiftUI App 프로토콜에서는 플랫폼에 적절하게 앱을 실행할 수 있는 프로세스를 구현한 main이라는 default implementation을 제공하고 있다.

extension App {

    /// Initializes and runs the app.
    ///
    /// If you precede your ``SwiftUI/App`` conformer's declaration with the
    /// [@main](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#ID626)
    /// attribute, the system calls the conformer's `main()` method to launch
    /// the app. SwiftUI provides a
    /// default implementation of the method that manages the launch process in
    /// a platform-appropriate way.
    @MainActor public static func main()
}

[Scene - protocol]

시스템에 의해 생명주기가 관리되는 앱의 UI의 일부

app의 body 내부에서 Scene프로토콜을 준수하는 하나 이상의 인스턴스들을 합쳐 App을 만든다

 

1. SwiftUI에서 제공하는 빌트인 scene으로는 WindowGroup이 있다.

-> WindowGroup : 여러 Window를 제공하는 플랫폼인 MacOS 및 아이패드OS에서 활용

 

2. 커스텀 Scene을 만들 땐 Scene 프로토콜을 준수하도록 하고, computed property인 body에서 content를 작성하면 된다

 

정리 : Scene은 사용자에게 표시할 뷰 계층을 위한 컨테이너 역할을 한다

 

 

[View - protocol]

앱의 UI를 나타내는 타입이며 view를 구현하기 위한 modifiers를 제공한다

 

App, Scene과 같이 computed property인 body를  통해 content를 구현하며

body 내부에서는 View를 준수하는 인스턴스들을 사용한다

 

[Modifier]

View 프로토콜은 modifier를 제공한다

여기서 modifier란 default implementation에 해당하는 프로토콜 메서드.

뷰의 레이아웃을 구현하기 위해서 modifier를 사용하게 된다

 

modifier는 뷰 인스턴스를 래핑하여 그 특성에 맞는 뷰로 다시 리턴한다

예를들어 Text라는 View에 .opacity modifier를 래핑하면, opacity가 적용된 View를 리턴한다

Text("Hello, World!")
    .opacity(0.5) // Display partially transparent text.

 

Modifier은 Layout, Accessibility, Input&Event 와 관련된 많은 종류가 있다.

 

 

 

 

 

'SwiftUI' 카테고리의 다른 글

SwiftUI 나를 위한 wiki(2) - Animation & Transition  (0) 2023.08.02