특정 역할을 하기 위한 메소드,프로퍼티,기타 요구사항 등을 정의해놓은 규약 혹은 약속
class,struct,enum이 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있다.
프로토콜에서는 이름과 타입 그리고 gettable,settable을 명시해야 하고 프로퍼티는 항상 var로 선언해야 한다.
상속은 다중 상속이 불가능하지만 프로토콜은 다중 상속이 가능하다.
protocol Vehicle {
var speed: Double { get set }
var manufacturer: String { get }
}
class Car: Vehicle {
var speed: Double = 0.0
var manufacturer: String = "Toyota"
}
class Bicycle: Vehicle {
var speed: Double = 0.0
var manufacturer: String { return "Giant" }
}
let car = Car()
car.speed = 60.0
print(car.speed)
print(car.manufacturer)
let bike = Bicycle()
bike.speed = 20.0
print(bike.speed)
print(bike.manufacturer)
// 프로토콜의 다중상속
protocol Coordination {
var top: String { get set }
var pants: String { get set }
init(top: String, pants: String)
func checkCoordination()
}
protocol Hair {
var hair: String { get }
func checkHairStyle()
}
struct Person: Coordination, Hair {
var top: String
var pants: String
let hair: String = "포마드"
func checkHairStyle() {
print("오늘의 헤어스타일은 \(hair)스타일")
}
func checkCoordination() {
print("상의: \(top) 하의: \(pants)")
}
init(top: String, pants: String) {
self.top = top
self.pants = pants
}
}
let safari: Person = Person(top: "긴팔", pants: "반바지")
safari.checkHairStyle()
safari.checkCoordination()