Я думаю, вы можете добраться туда, добавив (пустое) расширение к UIViewController
, а затем указав свой атрибут detailViewController
, используя составленный протокол пустого расширения и ваш DetailViewController
. Например:
protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}
Теперь все подклассы UIViewController
удовлетворяют протоколу UIViewControllerInject
. Тогда с этим просто:
typealias DetailViewControllerComposed = protocol<DetailViewController, UIViewControllerInject>
class MasterViewController : UITableViewController {
var detailViewController : DetailViewControllerComposed?
// ...
}
Но это не особенно «естественно».
=== Edit, Дополнение ===
Фактически , вы можете сделать это немного лучше, если вы определите свой DetailViewController
, используя мой предложенный UIViewControllerInject
. Например:
protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}
protocol DetailViewController : UIViewControllerInject { /* ... */ }
, и теперь вам не нужно явно что-то компилировать (мой DetailViewControllerComposed
) и использовать DetailViewController?
как тип для detailViewController
.
Другим способом было бы ввести промежуточные базовые классы для соответствующих контроллеров представления UIKit, которые реализуют протокол:
class MyUIViewControler : UIViewController, DetailViewController ...
class MyUITableViewController : UITableViewController, DetailViewController ...
. Затем вы наследуете контроллеры представлений от этих контроллеров представления, а не UIKit.
Это тоже не является естественным, но это не заставляет всех ваших UIViewControllers
удовлетворять протоколу UIViewControllerInject
, как предлагал GoZoner.
MyUIViewController
, либо MyUITableViewController
.
– Frank Schmitt
11 August 2014 в 16:31
var detailViewController: DetailViewController
быть подклассомUIViewController
строго? Точно так же ясно, как объявление@property (strong, nonatomic) UIViewController<DetailViewController> detailViewController;
в Objective-C. Возможно ли, чтобы Свифт это сделал? – liuyaodong 29 October 2014 в 14:29UIViewControllerInject
прошли где-то в коде, вы не можете вызвать какой-либо методUIViewController
на нем без принудительного каста (as!
). К сожалению, я считаю, что в настоящее время нет возможности объявить переменную как определенный класс, соответствующий определенному протоколу, как это возможно в ObjC. Вы можете, конечно, объявить все методы, которые вам нужны изUIViewController
в протоколеUIViewControllerInject
. – Charlie Monroe 25 December 2015 в 10:34