상속은 클래스에서만 가능하며 필요하지않은 속성과 메서드까지 모두 하위 클래스에서 상속받아야 하는 단점이 있다. 이러한 문제들은 프로토콜(Protocols)을 사용해 기능을 대체할 수 있다.
프로토콜은 영어로 '규약'의 뜻을 갖고 있다.
프로토콜은 클래스, 구조체, 열거형에서 사용가능하며 여러개의 프로토콜을 각 타입에 적용 가능하다. 즉 스위프트는 프로토콜을 "일급객체"로 취급하고 있다. 따라서,
protocol MyProtocol { // 최소한의 요구사항 나열
func doSomething() -> Int
}
class FamilyClass { }
class MyClass: FamilyClass, MyProtocol {
...
func doSomething() -> Int {
...
}
}
struct MyStruct: MyProtocol {
...
func doSomething() -> Int {
...
}
}
enum MyEnum: MyProtocol {
...
func doSomething() -> Int {
...
}
}
protocol MyProtocol {
var id: String { get } // 항상 'var'로만 선언해야한다.
var name: String { get set }
static var type: String { get set }
mutating func toggle() //
}
{ get } 은 구현부에서
- 저장 속성 : let / var
- 계산 속성 : 읽기(get) / 읽기쓰기(get/set)
{ get set } 은 구현부에서
- 저장 속성 : var
- 계산 속성 : 읽기쓰기(get/set)
{ get } 은 읽기(get) / 읽기쓰기(get/set) 모두 구현 가능하다.
{ get set } 은 읽기쓰기(get/set)를 모두 구현해야 한다.
확장에서 구현한 메서드는 하위 클래스에서 재정의 할 수 없다는 단점이 있으나, 관습적으로 프로토콜은 확장(extension)에서 구현하는 것을 권장한다.