为什么我们不用它们的委托对象实例化委托类?
我无法想象委托下载程序类或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元素:
- 屏幕顶部的
UITableView
- 用户名的
UITextField
- 密码的
UITextField
- 屏幕底部的
UITextView