[swift] Protocols

GOSARI·2021년 11월 2일
0

swift

목록 보기
6/11

Protocols 참고문서

프로토콜은 메소드, 프로퍼티, 기타 요구사항들의 청사진(blueprint)이다.


프로퍼티 요구사항 (Property Requirements)

프로토콜의 프로퍼티에 { get }을 명시하면, 채택한 구조체는 var, let 모두 사용이 가능하다.
프로토콜의 프로퍼티에 { get, set }을 사용하면 채택한 구조체는 var만 사용가능하다.

protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}

타입으로써의 프로토콜 (Protocols as Types)

하나의 타입이기 때문에 타입이 사용되는 아래와 같은 케이스에 모두 사용 가능하다.

  • 함수, 메소드, 이니셜라이저의 파라미터 타입 혹은 리턴 타입
  • 상수, 변수, 프로퍼티의 타입
  • 컨테이너인 배열, 사전 등의 아이템 타입

변경 가능한 메소드 요구사항 (Mutating Method Requirements)

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!

위임 (Delegation)

(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) 이다.

0개의 댓글