Blog

Swift Study #7 후기

August 17, 2014

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를 프로토콜 앞에 명시 / 클래스에만 적용