[swift] 프로토콜이 특정 클래스에서만 채택되도록 요구하는 방법

이 프로토콜을 원합니다.

protocol AddsMoreCommands {
     /* ... */
}

클래스에서 상속 된 클래스에서만 채택됩니다 UIViewController. 이 페이지 는 작성하여 (구조체가 아닌) 클래스에서만 채택되도록 지정할 수 있음을 알려줍니다.

protocol AddsMoreCommands: class {
}

하지만 특정 클래스에서만 채택하도록 요구하는 방법을 알 수 없습니다. 이 페이지는 나중에where 적합성을 확인하기 위해 프로토콜 확장에 절을 추가 하는 방법에 대해 설명하지만 그 방법도 볼 수 없습니다.

extension AddsMoreCommands where /* what */ {
}

이를 수행하는 방법이 있습니까? 감사!



답변

protocol AddsMoreCommands: class {
    // Code
}

extension AddsMoreCommands where Self: UIViewController {
    // Code
}


답변

이는 확장 없이도 가능합니다.

protocol AddsMoreCommands: class where Self: UIViewController {
   // code
}

2017/11/04 편집 : Zig가 지적했듯이 이것은 Xcode 9.1에서 경고를 생성하는 것 같습니다. 현재 Swift 프로젝트 (SR-6265) 에서 경고를 제거하기 위해 보고 된 문제 가 있습니다. 계속해서 주시하고 그에 따라 답변을 업데이트하겠습니다.

EDITED 2018/09/29 : class인스턴스를 저장할 변수가 약해야하는 경우 (예 : 델리게이트) 필요합니다. 약한 변수가 필요하지 않은 경우를 생략 class하고 다음을 작성하면 경고가 표시되지 않습니다.

protocol AddsMoreCommands where Self: UIViewController {
   // code
}


답변

이전 답변의 문제로 인해 다음 선언으로 끝났습니다.

protocol AddsMoreCommands where Self : UIViewController {
    // protocol stuff here  
}

Xcode 9.1에서 경고 없음


답변

이제 Swift 5에서 다음을 수행 할 수 있습니다.

protocol AddsMoreCommands: UIViewController {
     /* ... */
}

아주 편리합니다.


답변