Swift Study #7 후기
Protocols
프로토콜은 특정한 일이나 기능의 일부에 대한 메소드나 속성이나 다른 요구사항들의 전체적인 모습을 정의한다. 실제로 이런 요구사항들의 구현을 제공하지는 않고, 그 구현이 어떻게 보일지에 대해 명시한다.
클래스, 구조체, 열거형 등에 프로토콜이 적용될 수 있다. 프로토콜의 요구사항을 만족하면 어떤 타입이라도 그 프로토콜에 일치한다라고 말한다.
Property Requirements
- 속성의 이름과 타입, 읽기(get)인지 읽기/쓰기(get/set)인지 명시
- 타입 속성은 class 또는 구조체나 열거형에는 static 키워드 사용
Method Requirements
- 메소드의 이름과 인자, 반환타입을 명시
- 중괄호나 메소드 구현체는 없음
- 가변길이 변수도 가능하지만 기본값은 사용 안됨
Protocols as Types
- 함수, 메소드, 생성자에서 인자의 타입으로 혹은 반환 타입으로
- 상수, 변수, 속성의 타입으로
- 배열, 사전, 다른 컨테이너에서 요소의 타입으로 사용될 수 있음
Delegation
- 위임은 클래스나 구조체가 다른 타입의 인스턴스에게 책임의 일부를 넘길(혹은 위임할) 수 있는 디자인 패턴
- 위임된 책임을 캡슐화하는 프로토콜을 정의하는데, 거기에 일치하는 타입(대리자로 알려진)은 위임받은 기능이 있다고 보장
- 위임은 특정 액션에 대해 응답하거나, 외부에서 온 정보가 어떤 타입인지에 관계없이 데이터를 처리할 때 사용할 수 있음
Protocol with an Extension
- 타입을 확장하면서 프로토콜을 추가할 수 있음
- 확장을 타입에 추가하는 순간 이미 만들어놓은 인스턴스들에서도 프로토콜이 적용되고 일치하게 됨
- 이미 프로토콜의 모든 요구사항에 일치하고 있지만 프로토콜을 적용한다고 명시하지 않았을 때, 빈 확장과 함께 프로토콜을 적용시킬 수 있음
Collections of Protocol Types
- 배열이나 사전같은 콜렉션에서 저장되는 타입으로 사용할 수 있음
Protocol Inheritance
- 프로토콜은 하나 이상의 프로토콜을 상속받을 수 있고, 그 요구사항들 위에 다른 요구사항을 추가할 수도 있음
Protocol Composition
- 프로토콜 합성은 여러 프로토콜을 하나의 요구사항으로 합칠 수 있음
- 프로토콜 합성은 protocol
- 합성에 있는 모든 프로토콜의 요구사항을 합친 하나의 프로토콜을 임시로 만듬
Checking for Protocol Conformance
- 특정 프로토콜로 캐스팅하기 위해서 프로토콜 일치를 확인하는데 is와 as 연산자를 사용
- is 연산자에서는 인스턴스가 프로톨과 일치하면 true, 아니면 false 리턴
- as? 다운캐스팅 연산자는 프로토콜 타입의 옵션값을 리턴하는데 인스턴스가 프로토콜과 일치하지 않으면 nil
- as 연산자는 강제로 다운캐스팅하고 실패하면 런타임 에러
- @objc를 프로토콜 앞에 명시 / 클래스에만 적용
Optional Protocol Requirements
- 프로토콜에 일치하기 위해서 구현하지 않아도 되는 선택적 요구사항들은 정의 앞에 optional를 붙임
- 요구사항 구현을 확인할 때는 옵션 연쇄(Optional Chaining)와 같이 사용
- 역시 @objc를 프로토콜 앞에 명시 / 클래스에만 적용