Подтвердить что ты не робот

Как требовать, чтобы протокол мог быть принят только определенным классом

Я хочу этот протокол:

protocol AddsMoreCommands {
     /* ... */
}

только для классов, которые наследуются от класса UIViewController. Эта страница сообщает мне, что я могу указать, что она принимается только классом (в отличие от структуры), написав

protocol AddsMoreCommands: class {
}

но я не вижу, как требовать, чтобы он был принят только определенным классом. Эта страница позже рассказывает о добавлении предложений where к расширениям протокола для проверки соответствия, но я не могу понять, как это сделать.

extension AddsMoreCommands where /* what */ {
}

Есть ли способ сделать это? Спасибо!

4b9b3361

Ответ 1

protocol AddsMoreCommands: class {
    // Code
}

extension AddsMoreCommands where Self: UIViewController {
    // Code
}

Ответ 2

Это также может быть достигнуто без расширения:

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

EDITED 2017/11/04: как указывал Zig, это похоже на предупреждение Xcode 9.1. В настоящее время в проекте Swift сообщается о проблеме (SR-6265), чтобы убрать предупреждение, я буду следить за ним и соответствующим образом обновлять ответ.

EDITED 2018/09/29: class необходим, если переменная, в которой будет храниться экземпляр, должна быть слабой (например, делегат). Если вам не нужна слабая переменная, вы можете опустить class и просто написать следующее, и никаких предупреждений не будет:

protocol AddsMoreCommands where Self: UIViewController {
   // code
}

Ответ 3

Из-за проблемы в предыдущем ответе я оказался в этом объявлении:

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

никаких предупреждений в Xcode 9.1

Ответ 4

Теперь в Swift 5 этого можно достичь следующим образом:

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

Довольно удобно.