protocol 조건적용

작성일

protocol 조건적용

// 이름 관련 프로토콜
protocol Naming {
    var name: String { get set }
}
// 캣과 친구 클래스가 프로토콜을 준수하고 있는 상황
class Cat: Naming {
    var name: String
    init(name: String) {
        self.name = name
    }
}
class Friend: Naming {
    var name: String
    init(_ name : String) {
        self.name = name
    }
}
// extension으로 확장 할때 준수하고 있는 특정 클래스에만 정의가 가능하다
// (struct는 안되고 클래스일때만 가능
extension Naming where Self: Friend {
    func sayName() {
        print("난 \(self.name) 라고 해")
    }
}

let myFriend = Friend("철수")
myFriend.sayName() // 난 철수 라고 해

extension Naming where Self: Cat {
    func sayName() {
        print("\(self.name): 야옹~")
    }
}
let myCat = Cat(name: "개냥이")
myCat.sayName() // 개냥이: 야옹~

출력

난 철수 라고 해
개냥이: 야옹~