티스토리 뷰

일반적으로 먼저 만들어져 있는 Class에 Extension 하여서 무엇을 만들게 되면 객체는 만들수가 없게 됩니다.

그런데 rx, snp, kf 등은 이렇게 하는 방법으로 무언가를 만들어서 사용합니다.

우리도 이렇게 하는 방법을 만들어 봅시다.

 

* 실제로는 이걸 만들어서 여러군데에 사용하고 싶기 때문에 한번만 만들고 나머지는 그냥 다 상속 받아서 사용할겁니다.

1. struct Extension

struct Extension<Base> {
    let base: Base
    init(_ base: Base) {
        self.base = base
    }
}

RxSwift 같은것들을 보면 위와 비슷한 코드가 있습니다.

이것은 뒤에 만들 ExtensionSupport의 값을 저장하는 용도로 만들기 위해서 두도록 합니다.

2. protocol ExtensionSupport

protocol ExtensionSupport {
    associatedtype Compatible
    var extend: Extension<Compatible> { get set }
    static var extend: Extension<Compatible>.Type { get set }
}

extension ExtensionSupport {
    var extend: Extension<Self> {
        get {
            return Extension(self)
        }
        set {

        }
    }
    static var extend: Extension<Self>.Type {
        get {
            return Extension<Self>.self
        }
        set {

        }
    }
}

이렇게만 만들어두면 어떠한 부분들도 구조화 시켜서 만들수 있습니다.

그럼 실제 적용해 봅시다.

3. UIView에 적용해 보기

extension UIView : ExtensionSupport {}

extension Extension where Base == UIView {
    var first: UIView? {
        return self.base.subviews.first
    }
}

let viewExt = UIView()
viewExt.extend.first

이 예제는 UIView에서 first를 접근해서 사용하는 방법입니다.

extension을 바로 만들어주어서 구조화 시킬수 있어서 라이브러리 만들때 좋을것 같네요.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함