프로토콜과 그 기본 구현을 활용해 중복을 피할 수 있다.
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의 서브클래스들만 해당 프로토콜 제공하는 기능을 사용할 수 있음.
추가)
상속과 차이가 있다면,
상속의 경우, 자식 클래스가 부모 클래스의 특성을 모두 받아오는 것을 의미
반면 프로토콜과 익스텐션은 타입에 특정 메서드 또는 계산 프로퍼티를 추가할 수 있는 방법을 제공.
'IOS' 카테고리의 다른 글
iOS @available 속성 설정 (0) | 2024.04.23 |
---|---|
new Framework(*) Unreal Engine에서 iOS Framework 적용하기 (0) | 2024.04.09 |
CFBundleURLSchemes 과 LSApplicationQueriesSchemes (0) | 2024.03.05 |
DYLD, Dynamic Link Editor이 무엇일까? (2) | 2023.10.16 |
[iOS] 자주 사용하는 컴파일 조건구문에 대하여 (#if, #endif, canImport 등) + available, unavailable (1) | 2023.10.10 |