teunteun2
SwiftUI 나를 위한 wiki(1) - App, Scene, View 본문
[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/
정의 : 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 |
---|