Objective-C中的protocol里存在@optional关键字,被这个关键字修饰的方法并非必须要被实 现。我们可以通过协议定义一系列方法,然后由实现协议的类选择性地实现其中几个方法。在 Cocoa API 中很多情况下协议方法都是可选的,这点和Swift中的protocol的所有方法都必须被 实现这一特性完全不同。
那些如果没有实现则协议就无法正常工作的方法一般是必须的,而相对地像作为事件通知或者对非关键属性进行配置的方法一般都是可选的。最好的例子我想应该是UITableViewDataSource和UITableViewDelegate。前者中有两个必要方法:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
分别用来计算和准备 tableView 的高度以及提供每一个cell的样式,而其他的像是返回section个 数或者询问cell是否能被编辑的方法都有默认的行为,都是可选方法;后者 (UITableViewDele