본문으로 바로가기

프로토콜은 타입이다

- 프로토콜을 변수에 할당할수 있다

- 프로토콜을 함수의 파라미터로 전달할 수 있다

- 함수에서 프로토콜을 반환할 수 있다

protocol SomeProtocol { }

class AClass: SomeProtocol {
    
}

// 프로토콜타입의 변수에는 해당 프로토콜을 채택한 인스턴스 할당 가능
let aClass: SomeProtocol = AClass()

// 프로토콜 채택여부 확인
aClass is SomeProtocol  // true
// 프로토콜 타입으로 저장된 인스턴스를 원래의 타입으로 확인
aClass is AClass        // true

// 프로토콜이 채택된 클래스나 구조체로 다운캐스팅 가능
let aClass2: AClass = aClass as! AClass

aClass2 is SomeProtocol // true
aClass2 is AClass       // true

// 클래스나 구조체에서 채택된 프로토콜로 업캐스팅 가능
let aClass3: SomeProtocol = aClass2 as SomeProtocol

// 프로토콜은 타입이기 때문에 함수의 파라미터로 전달할수 있으며
// 당연히 반환도 가능하다
func doSomething(c: SomeProtocol) -> SomeProtocol {
    return c
}

// 함수 파라미터 타입의 프로토콜을 채택한 인스턴스를 전달(꼭 프로토콜 타입일 필요는 없음)
doSomething(c: aClass)
doSomething(c: aClass2)