NSObject
프로토콜도 어떤 타입이라 생각했을 때 프로토콜에게도 기능을 덧붙일 수 있다.
protocol Camper {
func study()
func sleep()
}
class Person {
}
class Dog {
}
extension: Person: Camper {
func study() {
print("오늘 빡공합니다.")
}
func sleep() {
print("2시간이라도 자자...")
}
}
extension: Dog: Camper {
func study() {
print("월월월")
}
func sleep() {
print("zzZZ...")
}
}
이렇게 할 수도 있지만 위와 같은 방법으로 요구사항만 프로토콜에 작성할 경우 똑같은 여러 클래스에 반복적으로 작성해주어야 하는 불편함이 있다.
이런 상황을 피하기 위해 extension을 활용한 프로토콜의 기본 구현을 사용할 수 있다.
protocol Camper {
func study()
func sleep()
}
extension: Camper {
func study() {
"누구든 이 기능을 사용해 공부할 수 있어"
}
func sleep() {
"누구든 이 기능을 사용해 잘 수 있어"
}
}
class Person: Camper {
}
class Dog: Dog {
func sleep() {
"프로토콜 기능의 잠 말고 개 특유의 잠을 청하고 싶어"
}
}
let steven: Person = Person()
steven.sleep() // 누구든 이 기능을 사용해 잘 수 있어
let coco: Dog = Dog()
coco.sleep() // 프로토콜 기능의 잠 말고 개 특유의 잠을 청하고 싶어
// 메서드의 오버라이드 기능과 비슷하다.
Camper의 역할을 요구하면서도 기능 자체를 가져가는 것이 extension을 활용한 프로토콜 기본 구현의 원리이다.
extension을 통해 프로토콜에게 요구사항 그리고 더 나아가 기능까지 구현하는 것이프로토콜 기본 구현
이다.
@thanks to Neph
protocol Animal {
}
extension Animal {
func eat() {
}
func barking() where Self: Dog {
print("오직 강아지만 짖을 수 있어요 멍멍")
}
func programming() where Self: Programmer {
}
}
// 강아지 클래스
class Dog: Animal {
}
// 사람 클래스
class Person: Animal {
}
let coco: Dog = Dog()
coco.bark()
let james: Person = Person()
person.bark() ❌ // 조건이 안돼요!~!!
person.eat() ✅ // 사람은 먹을 수 있어요! 밥 먹자 밥
where을 활용하여 extension
에 조건을 달 수 있다.
예를들면 동물이라는 객체지만 짖는 것은 Dog 타입만 할 수 있게 설정하고 싶으면 where
절을 사용하면 됩니다.
저장 프로퍼티는 extension에 구현할 수 없습니다.
프로퍼티 옵저버는 extension에 구현할 수 없습니다.