[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 {
/* ... */
}
아주 편리합니다.