프로토콜을 타입으로 사용
프로토콜에 아무런 기능이 없더라도,스위프트 언어에서는 여전히 하나의 완벽한 타입으로 간주하며, 대부분 다른 타입과 마찬가지로 사용될 수 있다. 이는 프로토콜을 함수의 매개변수나 반환타입으로 사용할 수 있음을 의미한다. 또한 프로토콜을 변수나 상수, 그리고 컬렉션에 대한 타입으로도 사용할 수 있다.
protocol Person {
var firstName: String {get set}
var lastName: String {get set}
var birthDate: Date {get set}
var profession: String {get}
init(firstName: String, lastName: String, birthDate: Date)
}
Person 프로토콜은 네 개의 프로퍼티와 한 개의 생성자를 정의하고 있다.
아래 예는 프로토콜을 함수나 메서드 또는 생성자의 매개변수와 반환 타입으로 사용하는 방법이다.
func updatePerson(person: Person) -> Person {
var newPerson: Person
return newPerson
}
아래 예는 프로토콜을 컬렉션에 저장하기 위한 타입으로 사용하는 방법이다.
var personArray = [Person]()
var personDict = [String: Person]()
프로토콜 타입을 요구하는 곳 어디에서나 이 프로토콜을 따르는 타입의 인스턴스를 사용할 수 있다.
Person 프로토콜을 따르는 SwiftProgrammer 와 FootballPlayer 이름의 두 타입이 있다면 다음과 같이 사용할 수 있다.
var myPerson: Person
myPerson = SwiftProgrammer(firstName: "Kim", lastName: "minsu", birthDate: Date())
myPerson = FootballPlayer(firstName: "Park", lastName: "jisung", birthDate: Date()) // 인스턴스의 타입 변경
Person 프로토콜은 배열에 대한 타입으로 사용될 수 있다. 그러므로 다음과 같은 배열을 생성할 수 있다.
var programmer = SwiftProgrammer(firstName: "Kim", lastName: "minsu", birthDate: Date())
var player = FootballPlayer(firstName: "Park", lastName: "jisung", birthDate: Date())
var people: [Person] = [programmer, player]
마지막 예는 다형성polymorphism의 한 형태다. 프로토콜을 잘 활용하기 위해서 다형성이 무엇인지 이해해야만 한다.