//
// 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)
}
}
}
Last active
September 3, 2021 07:24
-
-
Save TuenTuenna/fd20da8a319cbf4fac06f59e882c8bbf to your computer and use it in GitHub Desktop.
프로토콜로 [weak self] 보일러 템블릿 없애기!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment