tl; dr: Как я могу сказать Swift, что я переопределяю свойство MyViewController
view
с подклассом UIView
?
Что я хотел бы сделать
Я большой поклонник предоставления подкласса UIView
для представления UIViewController
. Например:
// MyView --------------------------------------------------------
@interface MyView: UIView
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation MyView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
_tableView = [[UITableView alloc] initWithFrame:frame];
}
return self;
}
@end
// MyViewController ----------------------------------------------
@interface MyViewController: UIViewController <UITableViewDataSource>
@property (nonatomic, retain) MyView *view;
@end
@implementation MyViewController
- (void)loadView {
self.view = [[MyView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.tableView.dataSource = self;
// etc.
}
@end
Это здорово, потому что он отделяет логику создания и компоновки представления от контроллера вида. Хорошо, отлично.
Вблизи, как я могу понять, это переводится как Swift так:
// MyView --------------------------------------------------------
class MyView: UIView {
let tableView: UITableView!
init(frame: CGRect) {
super.init(frame: frame)
tableView = UITableView(frame: frame)
}
}
// MyViewController ----------------------------------------------
class MyViewController: UIViewController, UITableViewDataSource {
override func loadView() {
view = MyView(frame: UIScreen.mainScreen().bounds)
}
override func viewDidLoad() {
super.viewDidLoad()
// this causes the compiler to complain with:
// 'UIView' does not have a member named 'tableView'
self.view.tableView.dataSource = self
}
}
Проблема в том, что я не могу понять, как сообщить контроллеру представления, что его view
является экземпляром MyView
, а не UIView
.
Неудачные попытки
Вот что я пробовал до сих пор:
Я пробовал это в верхней части MyViewController
со следующей ошибкой:
override var view: MyView!
// error: Cannot override mutable property 'view' of
// type 'UIView' with covariant type 'MyView!'
Я пробовал это в loadView
, но не повезло:
view = MyView(frame: UIScreen.mainScreen().bounds) as MyView
// this produces the same error as in the original code:
// 'UIView' does not have a member named 'tableView'
Итак, вопрос
Как я могу сказать Swift, что я переопределяю свойство MyViewController
view
с одним из подклассов MyView
? Возможно ли это? Если нет, почему бы и нет?