Я хочу этот протокол:
protocol AddsMoreCommands {
/* ... */
}
только для того, чтобы быть принятыми классами, наследующими от класса UIViewController
. Эта страница сообщает мне, что я могу указать, что он принимается только классом (в отличие от структуры), написав
protocol AddsMoreCommands: class {
}
но я не понимаю, как требовать, чтобы он принимался только определенным классом. Позже на этой странице рассказывается о добавлении where
пунктов в расширения протокола для проверки соответствия, но я тоже не вижу, как это адаптировать.
extension AddsMoreCommands where /* what */ {
}
Есть ли способ сделать это? Благодарность!
self
Self
AddsMoreCommands
но метод,UIViewController
Этого также можно добиться без расширения:
protocol AddsMoreCommands: class where Self: UIViewController { // code }
ИЗМЕНИТЬ 2017/11/04 : Как заметил Зиг , это, похоже, генерирует предупреждение в Xcode 9.1. В настоящее время в проекте Swift (SR-6265) сообщается о проблеме, связанной с удалением предупреждения, я буду следить за ней и соответствующим образом обновлю ответ.
EDITED 2018/09/29 :
class
требуется, если переменная, которая будет хранить экземпляр, должна быть слабой (например, делегат). Если вам не нужна слабая переменная, вы можете опустить ееclass
и просто написать следующее, и никаких предупреждений не будет:protocol AddsMoreCommands where Self: UIViewController { // code }
источник
AnyObject
вместоclass
.protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }
AnyObject
Из-за проблемы в предыдущем ответе я получил это объявление:
protocol AddsMoreCommands where Self : UIViewController { // protocol stuff here }
нет предупреждений в Xcode 9.1
источник
AddsMoreCommands
кUIViewController
которой я хотел бы избежать ...typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommands
Теперь в Swift 5 этого можно добиться:
protocol AddsMoreCommands: UIViewController { /* ... */ }
Очень удобно.
источник