protocol 이름 : AnotherProtocol, AnotherProtocol {
// 정의
}
class SomeClass : SuperClass, AnotherProtocol, AnotherProtocol {
// 정의
}
채택하는 타입이 특정 기능을 실행하기 위해 필요한 기능을 요구한다.
프로퍼티 요구
protocol SomeProtocol {
var settableProtocol: String { get }
var notNeedProtocol: String { get set }
static var somProperty: Int { get set }
}
메서드 요구
protocol SomeProtocol {
func deletePost(postID: String) -> Bool
static func isDeletableInstance(_ instance: Any) -> Bool
mutating func resetBookmark()
}
프로토콜의 상속과 클래스 전용 프로토콜
- 프로토콜 상속 : 상속 + 상속 + 상속... = 3개의 기능 모두 추가. 작은 단위 → 큰 기능 가능
- 프로토콜 상속 리스트에 class 키워드 추가 → class 타입에만 채택될 수 있게 제한(제일 앞에 위치)
protocol Readable {
func read()
}
protocol Writable: class, Readable {
func write()
}
// 클래스라 채택 가능
class SomeClass: Writhable {
func read() { }
func write() { }
}
프로토콜 조합과 프로토콜 준수 확인
하나의 매개변수가 여러 프로토콜을 모두 준수하는 타입이어야 한다면 조합(Composition)하여 요구할 수 있음 : SomeProtocol & AnotherProtocl & ... 이렇게
클래스 인스턴스 역할을 할 수 있는지와 함께 확인할 수 있다. 구조체 열거형 안되고 클래도 한 타입만 조합 가능
is나 as로 타입을 확인하거나 캐스팅 할수 있다.
protocol Name {
var name: String { get }
}
protocol Aged {
var age: Int { get }
}
class Car: Named {
var name: String
init(name: String) {
self.name = name
}
}
class Truck: Car, Aged {
var age: Int
init(age: Int) {
self.age = age
}
}
// 클래스 역할도 할 수 있고 Aged 프로토콜도 준수하므로 할당할 수 있따.
var someVehicle: Car & Aged?
someVehicle = Truck(name: "Tank", age: 14)
프로토콜의 선택적 요구
@objc protocol Movable {
func walk()
@objc optional func fly()
}
class Tiger: NSObject, Movable {
func walk() { }
}
let tiger = Tiger()
tiget.fly?()
프로토콜 변수와 상수
위임을 위한 프로토콜
프로토콜은 완전한 하나의 타입으로 사용되기에 여러 위치에서 프로토콜을 타입으로 사용할 수 있다. 그래서