TIL(Today I Learned)

11월 14일(일)

학습내용

  • SwiftUI(CS193p Lecture3)
    • Architecture
      • MVVM (영상 처음부터 ~ 20:10 까지)

        Untitled

        • UIKit은 MVC를 사용했다면, SwiftUI는 MVVM을 사용.
        • Model
          • UI Independent (import SwiftUI 하지 않음)
          • Data + Logic(실제로 앱이 하는 작업)
          • Source of “The Truth”
        • View
          • UI Code
          • Model을 반영
          • Stateless
            • 비지니스 로직과 관련된 State 가 View 없다는 의미. UI를 위한 @State는 가질 수 있음
          • Immutable
            • 그래서 이미 생성된 View는 수정할 수 없고, body var 전체를 재생성해야한다.
            • View의 body var 구현된 내용만이 UI를 결정한다.
            • 이러한 방식을 Declarative(선언적)이라고 한다.
            • body var 이외에는 해당 뷰를 직접 변화시킬 수 없다.
              • body var만 신경쓰면 된다.
            • 이와 반대 방식은 Imperative이라고 한다.
              • UI의 변화를 여러 함수들 통해 로직을 순서대로 실행하여 이루어진다.
              • Imperative는 UI 변화에 대한 모든 가능한 경우의 수를 고려해야한다는 단점이 있다.
              • 경우의 수가 복잡해지면 잘못되는 경우의 수를 파악하기가 힘들어진다.
            • Model이 변화할 경우 해당 Model에 의존하는 뷰의 body var를 변화시킨다.
            • Reactive
        • View Model
          • Model의 변화를 알아차리고. 이를 publish 한다.
          • View를 Model로 bind 한다.
          • View Model을 Interpreter라고 할 수 있다.
            • View가 필요한대로 데이터를 가공하여 Model로 제공하기 때문에.
          • 또한 Gatekeeper라고 할 수 있다.
            • View는 View Model을 통해서만 Model을 전달받을 수 있기 때문에.
          • View가 View Model을 subscribe할 뿐이다.
          • 사용자 이벤트가 발생하면 뷰에서 View Model의 메서드(Intent Function)를 호출해서 model을 변화시킬 수 있다.
    • Varieties of Types
      • struct vs class
        • 공통점
          • stored vars
          • computed vars
          • constant lets
          • functions
          • init
        • 차이점
          • value type vs reference type
          • 복사해서 전달 및 할당 vs 포인터가 전달
          • Copy on Write vs ARC(automatically reference counted)
          • Functional programming vs Object-oriented programming
          • No Intgeritance vs Inheritance
          • Free init all vars vs Free init no vars
            • 자동 생성되는 init을 의미하는듯? struct는 모든 프로퍼티를 초기화해야하며, class는 아무것도 초기화하지 않는 init이 생성된다는 의미인듯?
          • Mutablilty must be explicitly stated vs always mutable
            • mutating 키워드를 명시해야 변경이 가능
          • Everything you’ve seen so far is a struct(except View which is a protocol) vs The ViewModel in MVVM is always a class (also, UIKit is a class-based)
      • “Dont’ care” type (aka generics)
        • 신경 쓰지 않아도 되는 타입? (당장 신경쓰지 않고 선언할때 타입 파라미터로 타입을 결정할 수 있는 타입이라고 할까?)
        • Swift는 강타입 언어이다. 항상 타입을 명시해야한다. 타입을 당장 결정할 수 없을 때는 generics을 사용한다.
        • Array가 대표적인 generics 사용 예이다.
          • array에는 타입에 상관없이 어떤 타입도 저장할 수 있다.
        • Type Parameter
          • 일반화(Generics)된 타입은 타입 파라미터로 입력된 타입으로 치환된다.
          • Swift에서는 프로토콜과 결합하여 더 강력해진다.
            • 타입 파라미터를 특정 프로토콜을 준수하느냐 아니냐로 제한할 수 있다.
      • Functions
        • 함수도 타입으로서 정의가 가능하다.
          • 인자가 무엇인지 반환타입은 무엇인지가 정의되어 일종의 함수 타입이 된다.
        • Closures
          • 함수를 클로져로 표현해서 사용할 수 있다.
          • 클로저를 inline된 함수라고 하기도 한다. (컴파일러가 하는 inline 의미는 아닌듯)

참고