Ответ 1
protocol AddsMoreCommands: class {
// Code
}
extension AddsMoreCommands where Self: UIViewController {
// Code
}
Я хочу этот протокол:
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
}
EDITED 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 {
/* ... */
}
Довольно удобно.