특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진. 프로토콜은 정의를 하고 제시를 할 뿐이지 스스로 기능을 구현하지 않음

  • 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있음
  • 어떤 프로토콜의 요구사항을 모두 따르는 타입은 '해당 프로토콜을 준수한다'고 표현
protocol ProtocolName {
	// define protocol
}

프로토콜의 프로퍼티 요구사항은 항상 var 키워드를 사용한 변수 프로퍼티로 정의

  • 읽기와 쓰기가 모두 가능한 프로퍼티는 { get set } 이라고 명시
  • 읽기 전용 프로퍼티는 { get } 이라고 명시

타입 프로퍼티를 요구하려면 static 키워드 사용

  • 상속 가능한 class 타입 프로퍼티와 상속 불가능한 static 타입 프로퍼티를 구분하지 않고 static 키워드 사용

스터디

스탠포드 4강에서 프로토콜에 대해서 설명하니까 그걸 봐야겠다.

  • 블라인드 커뮤니케이션에서 유용함 → Delegate 패턴
  • @objc 키워드를 붙이면 Objective-C의 프로토콜처럼 사용할 수 있음(프로토콜 내부의 메소드 구현이 선택적임)

    @objc 속성을 가진 프로토콜은 Objective-C 클래스를 상속받은 클래스에서만 채택 가능

  • 구조체에 의해 구현되어서 값을 수정하는 함수가 있다면 mutating 키워드가 필요함
  • 클래스만 받는 프로토콜을 표시하려면 class 키워드를 붙이면 됨

      protocol ClassProtocol: class {
    
      }
    
  • swift 자체적으로 타입 추적
  • & 를 이용해서 여러개 프로토콜을 묶어서 사용할 수 있음
    • 매개변수 전달할 때 많이 사용한다고 함
  • 권한을 주는데 유용함? → Hashable
  • initializer 구현할 때 required 표기해야 함
  • 실패 가능한 이니셜라이저 → init?()