1. Protocol
- 특정 역할을 수행하기 위한 메서드 / 프로퍼티 / 요구사항의 청사진
- 구조체 / 클래스 / 열거형은 프로토콜을 채택해서 요구사항을 구현 가능
- 프로토콜은 기능을 정의하고 제시 / 스스로 구현하지는 않는다.
protocol ProtocolName {
}
2. 구현 예시
protocol Talkable {
var topic: String { get set }
var language: String { get }
func talk()
init(topic: String, language: String)
}
3. 프로토콜 채택 및 준수
struct Person: Talkable {
var topic: String
let language: String
func talk() {
print("\(topic)에 대해 \(language)로 말합니다")
}
init(topic: String, language: String) {
self.topic = topic
self.language = language
}
}
struct Person: Talkable {
var subject: String = ""
var topic: String {
set {
self.subject = newValue
}
get {
return self.subject
}
}
var language: String { return "한국어" }
func talk() {
print("\(topic)에 대해 \(language)로 말합니다")
}
init(topic: String, language: String) {
self.topic = topic
}
}
4. 프로토콜 상속
- 프로토콜은 하나 이상의 프로토콜을 상속가능
- 다중상속 가능
protocol ProtocolName: ParentProtocl1, ParentProtocol2, .. {
code
}
protocol Readable {
func read()
}
protocol Writeable {
func write()
}
protocol ReadSpeakable: Readable {
func speak()
}
protocol ReadWriteSpeakable: Readable, Writeable {
func speak()
}
struct SomeType: ReadWriteSpeakable {
func read() {
print("Read")
}
func write() {
print("Write")
}
func speak() {
print("Speak")
}
}
5. 클래스 상속과 프로토콜 상속
- 클래스 상속에서 프로토콜을 채택할 경우
- 클래스를 먼저 명시하고 그 뒤에 프로토콜 목록을 작성
class SuperClass: Readable {
func read() { }
}
class SubClass: SuperClass, Writeable, ReadSpeakable {
func write() { }
func speak() { }
}
6. 프로토콜 준수 확인
let sup: SuperClass = SuperClass()
let sub: SubClass = SubClass()
var someAny: Any = sup
someAny is Readable
someAny is is ReadSpeakable
someAny = sub
someAny is Readable
someAny is is ReadSpeakable
someAny = sup
if let someReadable: Readable = someAny as? Readable {
someReadable.read()
}
if let someReadSpeakable: ReadSpeakable = someAny as? ReadSpeakable {
someReadSpeakable.speak()
}
someAny = sub
if let someReadable: Readable = someAny as? Readable {
someReadable.read()
}