Swift / UIKit:了解内置方法的结构

Swift / UIKit: understanding the structure of built-in methods

我是 Swift 和 UIKit 的新手,主要来自 Python,我在教程和文档的复制粘贴方面遇到了麻烦我'到目前为止一直在看。我很难对以下方法有基本的了解:

override func tableView( ... numberOfRowsInSection ... )

override func tableView( ... cellForRowAt ... )

在实践中,我可以毫无问题地使用它们,但我将不胜感激任何澄清或指向可以解释的参考资料:

  1. 为什么 UIKit 方法结构如此,而不是专用的
func tableViewNumberOfRowsInSection( ... )
    
func tableViewCellForRowAt( ... )

(或者,为什么不把numberOfRowsInSection作为UITableViewController的子类的一个属性,而不是一个看起来有上百种用途的函数(tableView)的一个参数呢?)

Function/Method 标签、参数名称等基础知识对我来说非常有意义,但我似乎无法理解为什么 func tableView 会按现在的方式构建。

  1. tableView 的最终调用是什么样的?

在此先感谢您的帮助或指点!

我不会在这个答案中详细介绍,但 UIKit 中的委托方法(就像你展示的那些)确实很长,而且几乎不可能不输入来自 auto-complete 的帮助。 我认识的人都没有记住所有这些(我尝试过,但失败了)。

之所以存在,是因为 UIKit 本身是由 Apple 在 Objective-C 中编写的。 如果 UIKit 在今天 Swift 被重写(这永远不会发生,因为 Apple 多年来在框架上投入了大量精力,SwiftUI),API 可能会更好地遵循 Swift API 设计的做法。

具体回答您的问题:

  1. 这就是它们一直以来的方式——如果对它们进行任何更改,将会破坏很多开发人员的源代码。可以说,您提出的那种方法签名并没有更好,只是有所不同。此外,如果您阅读了完整的方法签名,它们确实有意义并且足够清晰。

  2. 查看 UITableView 的一些教程。您展示的方法来自 UITableViewDelegate,这是您用来从代码配置 table 的 'glue' 的一种。这是因为在 Objective-C 早期,进行此类自定义的唯一方法是通过此 'delegation pattern'.

这些不是以不同方式使用的同一个函数 — 它们是完全不同的函数,因为参数标签是函数名称的一部分。每个函数的全称是 tableView(_:numberOfRowsInSection:)tableView(_:cellForRowAt:) 正如你在 the documentation. You might also want to read the Function Argument Labels and Parameter Names section of this guide, and maybe the naming guidelines.

中看到的

您不太可能自己调用​​这些方法,因为它们的存在是为了向 table 视图本身提供数据。 UITableView 会在内部调用你的方法,看起来像 dataSource.tableView(self, cellForRowAt: indexPath)。有关此模式的更多信息,请参阅 Protocols guide 中的 Delegation 部分。

还值得注意的是,这个 API 是为 Objective-C 创建的(在 Swift 发布之前),其中他们的 selectorstableView:numberOfRowsInSection:tableView:cellForRowAtIndexPath:。这可能不那么令人困惑,因为第一个参数标签在括号外没有“特权”。也就是说,根据 Swift 的命名标准,它仍然被认为是一个好的设计,至少只要设计需要使用 类(如果它不必支持 [,它可能不会) =27=]).