Get Up & Code, MacKin Talk

프로토콜과 기본 구현 extension ProtocolA where Self: Type 프로토콜 타입 제약 방법 본문

IOS

프로토콜과 기본 구현 extension ProtocolA where Self: Type 프로토콜 타입 제약 방법

맥킨 2024. 3. 15. 12:53

프로토콜과 그 기본 구현을 활용해 중복을 피할 수 있다.

Swift에서는 프로토콜의 익스텐션을 활용할 때 where 절을 사용해 타입 지정 방법을 제공

 

해당 익스텐션이 적용될 수 있는 타입의 범위를 제한할 수 있도록 해준다. 

 

예시로 

extension AProtocol {
 // methods...
}

프로토콜을 정의할 때 특별한 타입 제약을 지정하지 않은 경우, 그 프로토콜은 어떤 타입에서든 채택할 수 있음.

- 클래스, 구조체, 열거형 등

 

extension AProtocol where Self: UIView {
 // methods...
}

특정 타입에만 프로토콜을 적용하고 싶은 경우

 

where Self: UIView

Aprotocol을 확장하되, 그 확장의 범위는 UIView의 서브 클래스인 타입에만 적용한다는 의미

 

 

이 방식으로 사용할 경우, 프로토콜의 확장 내부에서 UIView의 특성이나 메서드를 안전하게 사용 가능.(서브클래스임을 보장할 수 있음)

 

하단처럼 CustomDrawable이라는 프로토콜을 생성했다고 했을 때

protocol CustomDrawable {
    func draw()
}

// UIView를 상속받는 타입에만 기본 구현을 제공
extension CustomDrawable where Self: UIView {
    func draw() {
        print("Drawing on a UIView or its subclass")
    }
}

class MyView: UIView, CustomDrawable {
    // MyView는 UIView를 상속받기 때문에, CustomDrawable의 기본 구현을 사용할 수 있음
}

class MyNonViewClass: CustomDrawable {
    // MyNonViewClass는 UIView를 상속받지 않기 때문에, draw() 메서드를 직접 구현해야 함
    func draw() {
        print("Drawing in a non-UIView class")
    }
}

 

프로토콜의 제한범위가 생겼기 때문에 where 절을 충족하는 UIView의 서브클래스들만 해당 프로토콜 제공하는 기능을 사용할 수 있음.

 

 

 

추가) 

상속과 차이가 있다면,

상속의 경우, 자식 클래스가 부모 클래스의 특성을 모두 받아오는 것을 의미

 

반면 프로토콜과 익스텐션은 타입에 특정 메서드 또는 계산 프로퍼티를 추가할 수 있는 방법을 제공.