Programing

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

crosscheck 2020. 10. 18. 08:26
반응형

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


이 프로토콜을 원합니다.

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 {
     /* ... */
}

아주 편리합니다.

참고URL : https://stackoverflow.com/questions/35133887/how-to-require-that-a-protocol-can-only-be-adopted-by-a-specific-class

반응형