프로토콜은 메소드, 프로퍼티, 기타 요구사항들의 청사진
(blueprint)이다.
프로토콜의 프로퍼티에 { get }
을 명시하면, 채택한 구조체는 var
, let
모두 사용이 가능하다.
프로토콜의 프로퍼티에 { get, set }
을 사용하면 채택한 구조체는 var
만 사용가능하다.
protocol SomeProtocol {
var mustBeSettable: Int { get set }
var doesNotNeedToBeSettable: Int { get }
}
하나의 타입
이기 때문에 타입이 사용되는 아래와 같은 케이스에 모두 사용 가능하다.
mutating을 명시한 프로토콜을 채택하는 클래스 형의 메서드에는 mutating을 명시하지 않아도 된다.
protocol Togglable {
mutating func toggleSleepStatus()
}
enum SleepManagement: Togglable {
case sleep, wake
mutating func toggleSleepStatus() {
switch self {
case .sleep:
self = .wake
case .wake:
self = .sleep
}
if self == .wake {
print("Wake Up!")
}
}
}
var alarm = SleepManagement.sleep
alarm.toggleSleepStatus()
// Wake Up!
(1)
프로토콜을 선언하고, (2)
프로토콜의 델리게이트를 가진 요소가 있고, (3)
프로토콜을 채택한 요소가 있다면
protocol Game {
func play()
func helpPlayer()
}
class EscapeRoom {
var reportType: Game?
var location: String?
}
class GameManagement: Game {
func play() { }
func helpPlayer() { }
}
행동의 디테일한 내용을 안내하는 건 (3)
프로토콜을 채택한 요소
이벤트가 생성됐을 때 프로토콜을 채택한 요소에게 안내하는 건 (2)
델리게이트를 가진 요소
이때 중요도에 따른 작성 순서는 (1)
-> (2)
-> (3)
이다.