CHAPTER 20 프로토콜
__20.1 프로토콜이란
프로토콜은 특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의
프로토콜은 정의를 하고 제시를 할 뿐이지 스스로 기능을 구현하지는 않습니다.
__20.2 프로토콜 정의
__20.3 프로토콜 요구사항
프로토콜은 타입이 특정 기능을 실행하기 위해 필요한 기능을 요구합니다. 프로토콜이 자신을 채택한 타입에 요구하는 사항은 프로퍼티나 메서드와 같은 기능들
20.3.1 프로퍼티 요구
프로토콜을 채택한 타입은 프로토콜이 요구하는 프로퍼티의 이름과 타입만 맞도록 구현해주면 됩니다.
프로퍼티를 읽기 전용으로 할지 혹은 읽고 쓰기가 모두 가능하게 할지는 프로토콜이 정해야 합니다.
읽고 쓰기가 가능한 프로퍼티를 요구한다면 읽기만 가능한 상수 저장 프로퍼티 또는 읽기 전용 연산 프로퍼티를 구현할 수 없습니다.
읽기 가능한 프로퍼티를 요구한다면 구현해주는 프로퍼티는 무엇이 되어도 상관없습니다.
프로토콜의 프로퍼티 요구사항은 항상 var 키워드를 사용한 변수 프로퍼티로 정의
{ get set }
{ get }
두 타입 프로퍼티를 따로 구분하지 않고 모두 static 키워드를 사용하여 타입 프로퍼티를 요구하면 됩니다.
20.3.2 메서드 요구
프로토콜의 메서드 요구에서는 매개변수 기본값을 지정할 수 없습니다.
static 키워드를 사용하여 요구한 타입 메서드를 클래스에서 실제 구현할 때는 static 키워드나 class 키워드 어느 쪽을 사용해도 무방
타입으로서의 프로토콜
프로토콜은 코드에서 완전한 하나의 타입으로 사용되기에 여러 위치에서 프로토콜을 타입으로 사용할 수 있습니다.
20.3.3 가변 메서드 요구
값 타입(구조체와 열거형)의 인스턴스 메서드에서 자신 내부의 값을 변경하고자 할 때는 메서드의 func 키워드 앞에 mutating 키워드
만약 Resettable 프로토콜에서 가변 메서드를 요구하지 않는다면, 값 타입의 인스턴스 내부 값을 변경하는 mutating 메서드는 구현이 불가능
20.3.4 이니셜라이저 요구
이니셜라이저 요구에 부합하는 이니셜라이저를 구현할 때는 required 식별자를 붙인 요구 이니셜라이저로 구현해야 합니다.
특정 클래스에 프로토콜이 요구하는 이니셜라이저가 이미 구현되어 있는 상황에서 그 클래스를 상속받은 클래스가 있다면, required와 override 식별자를 모두 명시하여 프로토콜에서 요구하는 이니셜라이저를 구현해주어야 합니다.
__20.4 프로토콜의 상속과 클래스 전용 프로토콜
프로토콜의 상속 리스트에 class 키워드를 추가해 프로토콜이 클래스 타입에만 채택될 수 있도록 제한할 수도 있습니다.
맨 처음에 class 키워드
__20.5 프로토콜 조합과 프로토콜 준수 확인
프로토콜을 조합하여 요구할 때는 SomeProtocol & AnotherProtocol과 같이 표현
구조체나 열거형 타입은 조합할 수 없습니다.
그리고 조합 중 클래스 타입은 한 타입만 조합할 수 있습니다.
프로토콜 캐스팅
is 연산자를 통해 해당 인스턴스가 특정 프로토콜을 준수하는지 확인할 수 있습니다.
as? 다운캐스팅 연산자를 통해 다른 프로토콜로 다운캐스팅을 시도해볼 수 있습니다.
as! 다운캐스팅 연산자를 통해 다른 프로토콜로 강제 다운캐스팅을 할 수 있습니다.
__20.6 프로토콜의 선택적 요구
프로토콜의 요구사항 중 일부를 선택적 요구사항으로 지정할 수 있습니다.
@objc 속성이 부여된 프로토콜이어야 합니다.
@objc 속성이 부여되는 프로토콜은 Objective-C 클래스를 상속받은 클래스에서만 채택할 수 있다는 것
@objc 속성을 사용하려면 애플의 Foundation 프레임워크 모듈을 임포트해야 합니다.
선택적 요구사항은 optional 식별자를 요구사항의 정의 앞에 붙여주면 됩니다.
(Int) -> String 타입의 메서드는 ((Int) -> String)? 타입
메서드의 매개변수나 반환 타입이 옵셔널이 된 것이 아니라 메서드(함수) 자체의 타입이 옵셔널이 된 것
__20.7 프로토콜 변수와 상수
프로토콜 이름을 타입으로 갖는 변수 또는 상수에는 그 프로토콜을 준수하는 타입의 어떤 인스턴스라도 할당할 수 있습니다.
Named 프로토콜을 타입으로 갖는 변수 someNamed에 Pet, Person, School 타입의 인스턴스가 할당될 수 있습니다
__20.8 위임을 위한 프로토콜
위임(Delegation)은 클래스나 구조체가 자신의 책임이나 임무를 다른 타입의 인스턴스에게 위임하는 디자인 패턴
책무를 위임하기 위해 정의한 프로토콜을 준수하는 타입은 자신에게 위임될 일정 책무를 할 수 있다는 것을 보장
위임은 사용자의 특정 행동에 반응하기 위해 사용되기도 하며, 비동기 처리에도 많이 사용
위임 패턴
UITableView타입의 인스턴스가 해야 하는 일을 위임받아 처리하는 인스턴스는 UITableViewDelegate프로토콜을 준수하면 됩니다
위임받은 인스턴스, 즉 UITableViewDelegate 프로토콜을 준수하는 인스턴스는 UITableView의 인스턴스가 해야 하는 일을 대신 처리
참고
야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019
댓글