为什么我们不用它们的委托对象实例化委托类?

我无法想象委托下载程序类或CLLLocationManager或tableView没有委托。 那么为什么我们需要创建它作为可选项呢?

我们为什么这样做

tableview = UITableView() tableview.delegate = self tableview.dataSource = self 

为什么不制作API,所以我们可以这样做:

 tableview = UITableView(delegate: self, dataSource: self) 

这是因为内存周期,所以我们可以先委托类或委托类,然后另一个? 这是唯一的原因吗?

即使是这种情况,使它无法使用也不仅仅是更方便

 class tableView{ var delegate: UITableViewDelegate? var dataSource: UITableViewDataSource? init(delegate: UITableViewDelegate? = nil, dataSource: UITableViewDataSource?){ self.delegate = delegate self.dataSource = dataSource } } var tableView = tableView() 

要求在实例化时声明委托对语言本身没有任何实际好处。 如果你真的感觉到需要,开发人员可以轻松添加,这是一种方便,但它不属于UIKit。

但是深入挖掘,你并不总是希望用委托实例化tableview。 如果代表不存在怎么办? 代表们并不总是self 。 您可能需要使用属性构建tableview,以便稍后显示或实现。

您可能还希望更改委托,对于阅读代码的人来说,可能会为调试添加大量不必要的混淆。 考虑以下伪代码:

 var tableview = UITableView(delegate:self) var childController = ChildControllerWithTableView() childController.prepareForSegue() { childController.tableview = tableview childController.tableview.delegate = childcontroller } 

您不仅更改了委托,使未来的开发人员感到困惑(可能包括您自己!),但您还必须(不必要地)将委托设置为self ,因为childController尚未存在。

或者,如果委托人是代表,如乔希指出的那样呢?

 var tableview = UITableView(delegate:tableview) 

等等,什么? 那不会飞!

不过,如果您愿意,可以将其添加到您的所有项目中 – 如果有业务需要(或方便)的原因! 这就是让Swift如此出色的原因:

 extension UITableView { convenience init(delegate: UITableViewDelegate? = nil, dataSource: UITableViewDataSource?){ self.delegate = delegate self.dataSource = dataSource } } 

实际上,有几种情况下您不需要委托。

请看以下屏幕。

在此处输入图像描述

你能找到多少没有代表的元素?

回答

有4个没有委托的UI元素:

  1. 屏幕顶部的UITableView
  2. 用户名的UITextField
  3. 密码的UITextField
  4. 屏幕底部的UITextView