@Delegate Protocol
protocol CustomViewDelegate: class {
func colorForBackground(_ newColor: UIColor?) -> UIColor
}
-> class를 상속받아 backgroundcolor를 바꿔주는 함수를 호출하게 됨
@Delegate 선언
final class CustomView: UIView {
weak var delegate: CustomViewDelegate?
override var backgroundColor: UIColor? {
get { return super.backgroundColor }
set {
let color = delegate?.colorForBackground(newValue)
let newColor = color ?? newValue ?? .gray
super.backgroundColor = newColor
print("새로 변경될 색은 :", newColor)
}
}
}
@Delegate 구현부
class ViewController: UIViewController, CustomViewDelegate {
@IBOutlet weak var customView: CustomView!
override func viewDidLoad() {
super.viewDidLoad()
customView.delegate = self
}
func colorForBackground(_ newColor: UIColor?) -> UIColor {
guard let color = newColor else { return .gray }
return color == .green ? .blue : color
}
}
@선언순서 정리
1. 프로토콜 정의
delegate 프로퍼티 선언
• 일반적으로 delegate 라고 명명
• 타입은 정의한 프로토콜과 동일
• optional
• weak
필요한 곳에서 delegate 객체의 메서드 실행
• delegate에 할당된 객체는 없을 수 있음 (nil)
• nil이 아니면 메서드 호출에 응답하여
어떤 로직(그게 무엇이 될지는 알 수 없음)을 수행
• 반환되는 값이 있을 경우 그 결과를 받아서 활용
@처리순서
1. delegate 프로토콜 채택
delegate 프로퍼티를 소유한 객체에게
위임받아 처리할 메서드를 구현한
객체 할당 (보통 self)
• 이 부분을 실수하는 경우가 많음
• 프로토콜을 채택하지 않은 경우 에러 메시지 발생
채택한 프로토콜의 메서드 구현
• 옵셔널 메서드인 경우 미구현 가능
• 이 메서드가 언제 호출될 지는 결정할 수 없으며,
그 시점은 위임하는 객체에 달려 있음
-> Delegate에는 다양하고 구체적인 메서드를 많이 제공하기에 연구하면 활용도가 높음!