728x90
반응형
v프로토콜은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 이니셜라이저 등의 요구사항을 정의한다.
구조체, 클래스, 열거형은 프로토콜을 채택(Adopted)해서 프로토콜의 요구사항을 실제로 구현할 수 있다.
어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 '프로토콜을 준수한다.(Conform)'고 표현한다.
프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 기능을 모두 구현해야 한다.
쉽게 말하면 어떤 타입(구조체등)에 "넌 특정 기능이 꼭 필요하니 무조건 구현해라"라는 것
protocol 프로토콜 이름{
정의
}
protocol Talkable{
// 프로퍼티 요구
// 프로퍼티 요구는 항상 var 키워드를 사용한다.
// get은 읽기만 가능해도 상관 없다는 뜻이며
// get과 set을 모두 명시하면
// 읽기 쓰기 모두 가능한 프로퍼티여야 한다.
var topic: String{get set} // 읽기 쓰기 가능
var language: String{get} // 읽기만 가능
// 메서드 요구
func talk() // 프로토콜에서는 메서드를 구현하지는 않고 상속받은 타입에서 구현한다.
// 이니셜라이저 요구
init(topic: String, language: String)
}
// Person 구조체는 Talkable 프로토콜을 채택했습니다.
struct Perosn: Talkable {
var topic: String
let language: String # 상수이므로 읽기만 가능
// 읽기전용 프로퍼티 요구는 연산 프로퍼티로 대체가 가능한다.
// var language: string { return "한국어" } // get만 구현된 것과 동일
// 물론 읽기, 쓰기 프로퍼티도 연산 프로퍼티로 대체할 수 있다.
var subject: String = ""
var topic: String{
set {
self.subject = newValue
}
get {
return self.subject
}
}
func talk(){
print("\(topic)에 대해 \(language)로 말합니다")
}
init(topic: String, language: String){
self.topic = topic
self.language = language
}
}
프로토콜 상속
프로토콜은 클래스와 다르게 다중 상속이 가능하다.
protocol 프로토콜 이름: 부모 프로토콜 이름 목록 {
정의부
}
protocol Readable {
func read()
}
protocol Writeable{
func write()
}
protocol ReaSpeakable: Readable{
// func read()
func speak()
}
protocol ReadWriteSpeakable: Readable, Writeable {
// func read()
// func write()
func speak()
}
struct SomeType: ReadWriteSpeakable {
func read(){
print("Read")
}
func write(){
print("Write")
}
func speak(){
print("SpeaK")
}
}
// 프로토콜의 메서드를 하나라도 구현하지 않으면 crash
클래스 상속과 프로토콜
클래스에서 상속과 프로토콜 채택을 동시에 하려면 상속받으려는 클래스를 먼저 명시하고 그 뒤에 채택할 프로토콜 목록을 작성한다.
class SuperClass: Readable{
func read() { print("read")}
}
//
class SubClass: superClass, Writeable, ReadSpeakable{
func write() {print("wirte")}
func speak() {print("speak")}
}
is, as 연산자를 사용하여 인스턴스가 특정 프로토콜을 준수하는지 확인할 수 있다.
let sup: SuperClass = SuperClass()
let sub: SubClass = SubClass()
var someAny: Any = sup
someAny is Readable // True
someAny is ReadSpeakable // false
someAny = sub
someAny is Readable // true
someAny is ReadSpeakable // true
someAny = sup
if let someReadable: Readable = someAny as? Readable {
someReadable.read()
} // read
if let someReadSpeakable: ReadSpeakable = someAny as? ReadSpeakable{
someReadSpeakable.speak()
} // 동작하지 않음
someAny = sub
if let someReadable: Readable = someAny as? Readable {
someReadable.read()
} // read
반응형
'IOS' 카테고리의 다른 글
swift - 오류처리 Error Handling by yagom (0) | 2023.01.10 |
---|---|
swift - 익스텐션 extension by yagom (0) | 2023.01.10 |
swift - assert와 guard by yagom (0) | 2023.01.10 |
swift - 타입캐스팅 by yagom (0) | 2023.01.10 |
swift - 옵셔널 체이닝과 nil 병합 연산자 by yagom (0) | 2023.01.10 |