본문 바로가기
프로그래밍

[SwiftUI] UIView 의 SwiftUI 랩핑 클래스

by hansoo.labs 한수댁 2020. 7. 27.

ref: Inline wrapping of UIKit or AppKit views within SwiftUI

UIView를 스위프트UI로 활용하기 위해 UIViewRepresentable을 사용하는 데 템플릿 같은 구조를 매번 만들때마다 느낀 귀찮음이 있었다. 그 귀찮음을 덜어준 선델님의 랩핑 함수를 그대로 옮겨 저장한다. 알고보면 별거 아니지만, 왜 이걸 만들어볼 생각 안했을까.. // 와우!! 선델 짱.

import UIKit
import SwiftUI

struct Wrap<Wrapped: UIView>: UIViewRepresentable {
    typealias Updater = (Wrapped, Context) -> Void

    var makeView: () -> Wrapped
    var update: (Wrapped, Context) -> Void

    init(_ makeView: @escaping @autoclosure () -> Wrapped,
         updater update: @escaping Updater) {
        self.makeView = makeView
        self.update = update
    }

    func makeUIView(context: Context) -> Wrapped {
        makeView()
    }

    func updateUIView(_ view: Wrapped, context: Context) {
        update(view, context)
    }
}

// 편리한 생성자들 추가
extension Wrap {
    init(_ makeView: @escaping @autoclosure () -> Wrapped,
         updater update: @escaping (Wrapped) -> Void) {
        self.makeView = makeView
        self.update = { view, _ in update(view) }
    }

    init(_ makeView: @escaping @autoclosure () -> Wrapped) {
        self.makeView = makeView
        self.update = { _, _ in }
    }
}

태그

댓글0