Skip to content

Instantly share code, notes, and snippets.

@TuenTuenna
Last active September 3, 2021 07:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TuenTuenna/fd20da8a319cbf4fac06f59e882c8bbf to your computer and use it in GitHub Desktop.
Save TuenTuenna/fd20da8a319cbf4fac06f59e882c8bbf to your computer and use it in GitHub Desktop.
프로토콜로 [weak self] 보일러 템블릿 없애기!

Swift UIKit 강한참조 방지 위한 weak self 보일러 템플릿 없애기

//
//  ViewController.swift
//  realm_test
//
//  Created by Jeff Jeong on 2021/01/22.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet var someLabel: UILabel!
    
    fileprivate func doSomething(with completion : @escaping (String) -> Void){
        DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
            completion("다했다~!")
        })
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // 적용 전
        doSomething(with: { [weak self] result in
            guard let self = self else { return }
            self.someLabel.text = result
        })
        // 적용 후
        doSomething(with: weakify{ strongSelf, result in
            strongSelf.someLabel.text = result
        })
    }
}


// 클래스 만이 클로져에서 강한참조가 가능하기 때문에 클래스 프로토콜로 설정
protocol Weakifying: class {}

// NSObject 가 Weakifying 프로토콜을 준수한다고 확장시키기
// 이를 통해 모든 것이 Weakifying 프로토콜이 적용된 효과
extension NSObject: Weakifying {}

// Weakifying 메소드를 확장으로 정의
extension Weakifying {
    // 약한 참조로 만드는 메소드
    // Self 자기 자신의 인스턴스
    // 제네릭으로 사용가능하도록 제네릭 매개변수 설정 <T>
    // 매개변수로 받는건 (Self, T) -> Void) 이지만
    // 반환 할때는 제네릭 데이터만 반환
    func weakify<T>(_ logic: @escaping (Self, T) -> Void) -> (T) -> Void {
        return {
            // weak self 약한참조 처리는 메소드 안에서 처리
            [weak self] data in
            guard let self = self else { return }
            // 호출부에서 사용할 logic
            logic(self, data)
        }
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment