
어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 '프로토콜을 준수한다(Confirm)' 고 표현 합니다.
프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 기능을 모두 구현해야 합니다.
protocol 프로토콜 이름 {
/* 정의부 */
}
protocol Talkable {
// 프로퍼티 요구
// 프로퍼티 요구는 항상 var 키워드를 사용합니다.
// get은 읽기만 가능해도 상관 없다는 뜻이며
// get과 set을 모두 명시하면 읽기 쓰기 모두 가능한 프로퍼티여야 합니다.
var topic: String { get set }
var language: String { get }
// 메서드 요구
func talk()
// 이니셜라이저 요구
init(topic: String, language: String)
}
struct Person: Talkable {
var topic: String
let language: String
// talk 메서드를 구현하여 Talkable 프로토콜의 요구사항을 준수합니다.
func talk() {
print("\(topic)에 대해 \(language)로 말합니다.")
}
// 프로토콜의 이니셜라이저 요구사항을 구현합니다.
init(topic: String, language: String) {
self.topic = topic
self.language = language
}
}
Person 구조체는 Talkable 프로토콜의 모든 요구사항을 준수하여 구현.
protocol Readable {
func read()
}
protocol Writeable {
func write()
}
protocol ReadSpeakable: Readable {
// func read() // Readable 프로토콜의 요구사항을 상속받습니다.
func speak()
}
protocol ReadWriteSpeakable: Readable, Writeable {
// func read() // Readable 프로토콜의 요구사항을 상속받습니다.
// func write() // Writeable 프로토콜의 요구사항을 상속받습니다.
func speak()
}
struct SomeType: ReadWriteSpeakable {
// Readable 프로토콜의 요구사항을 구현합니다.
func read() {
print("Read")
}
// Writeable 프로토콜의 요구사항을 구현합니다.
func write() {
print("Write")
}
// ReadWriteSpeakable 프로토콜의 요구사항을 구현합니다.
func speak() {
print("Speak")
}
}
SomeType은 Readable, Writeable, ReadWriteSpeakable 프로토콜의 모든 요구사항을 구현.
class SuperClass: Readable {
// Readable 프로토콜의 요구사항을 구현합니다.
func read() {
print("read")
}
}
class SubClass: SuperClass, Writeable, ReadSpeakable {
// Writeable 프로토콜의 요구사항을 구현합니다.
func write() {
print("write")
}
// ReadSpeakable 프로토콜의 요구사항을 구현합니다.
func speak() {
print("speak")
}
}
SubClass는 SuperClass를 상속받고, Writeable 및 ReadSpeakable 프로토콜을 채택합니다.
let sup: SuperClass = SuperClass() // SuperClass 인스턴스를 생성
let sub: SubClass = SubClass() // SubClass 인스턴스를 생성
var someAny: Any = sup
someAny is Readable // true - someAny는 SuperClass 인스턴스로, SuperClass는 Readable 프로토콜을 준수
someAny is ReadSpeakable // false - someAny는 SuperClass 인스턴스로, SuperClass는 ReadSpeakable 프로토콜을 준수하지 않음
someAny = sub
someAny is Readable // true - someAny는 SubClass 인스턴스로, SubClass는 SuperClass를 상속받아 Readable 프로토콜을 준수
someAny is ReadSpeakable // true - someAny는 SubClass 인스턴스로, SubClass는 ReadSpeakable 프로토콜을 준수
someAny = sup
// 프로토콜 준수 여부 확인 후 안전하게 타입 캐스팅
if let someReadable: Readable = someAny as? Readable {
someReadable.read() // someAny가 Readable 프로토콜을 준수하면 read 메서드 호출
} // 출력: "read"
if let someReadSpeakable: ReadSpeakable = someAny as? ReadSpeakable {
someReadSpeakable.speak() // someAny가 ReadSpeakable 프로토콜을 준수하면 speak 메서드 호출
} // 동작하지 않음 - someAny는 SuperClass 인스턴스로, ReadSpeakable 프로토콜을 준수하지 않음
someAny = sub
if let someReadable: Readable = someAny as? Readable {
someReadable.read() // someAny가 Readable 프로토콜을 준수하면 read 메서드 호출
} // 출력: "read"
프로토콜 준수 확인을 통해 인스턴스가 특정 프로토콜을 준수하는지 체크하고, 타입 캐스팅을 통해 안전하게 프로토콜 메서드를 호출할 수 있습니다.