Swift / UIKit:了解内置方法的结构
Swift / UIKit: understanding the structure of built-in methods
我是 Swift 和 UIKit
的新手,主要来自 Python,我在教程和文档的复制粘贴方面遇到了麻烦我'到目前为止一直在看。我很难对以下方法有基本的了解:
override func tableView( ... numberOfRowsInSection ... )
override func tableView( ... cellForRowAt ... )
在实践中,我可以毫无问题地使用它们,但我将不胜感激任何澄清或指向可以解释的参考资料:
- 为什么
UIKit
方法结构如此,而不是专用的
func tableViewNumberOfRowsInSection( ... )
func tableViewCellForRowAt( ... )
(或者,为什么不把numberOfRowsInSection
作为UITableViewController
的子类的一个属性,而不是一个看起来有上百种用途的函数(tableView)的一个参数呢?)
Function/Method 标签、参数名称等基础知识对我来说非常有意义,但我似乎无法理解为什么 func tableView 会按现在的方式构建。
- tableView 的最终调用是什么样的?
在此先感谢您的帮助或指点!
我不会在这个答案中详细介绍,但 UIKit 中的委托方法(就像你展示的那些)确实很长,而且几乎不可能不输入来自 auto-complete 的帮助。
我认识的人都没有记住所有这些(我尝试过,但失败了)。
之所以存在,是因为 UIKit 本身是由 Apple 在 Objective-C 中编写的。
如果 UIKit 在今天 Swift 被重写(这永远不会发生,因为 Apple 多年来在框架上投入了大量精力,SwiftUI),API 可能会更好地遵循 Swift API 设计的做法。
具体回答您的问题:
这就是它们一直以来的方式——如果对它们进行任何更改,将会破坏很多开发人员的源代码。可以说,您提出的那种方法签名并没有更好,只是有所不同。此外,如果您阅读了完整的方法签名,它们确实有意义并且足够清晰。
查看 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 发布之前),其中他们的 selectors 是 tableView:numberOfRowsInSection:
和 tableView:cellForRowAtIndexPath:
。这可能不那么令人困惑,因为第一个参数标签在括号外没有“特权”。也就是说,根据 Swift 的命名标准,它仍然被认为是一个好的设计,至少只要设计需要使用 类(如果它不必支持 [,它可能不会) =27=]).
我是 Swift 和 UIKit
的新手,主要来自 Python,我在教程和文档的复制粘贴方面遇到了麻烦我'到目前为止一直在看。我很难对以下方法有基本的了解:
override func tableView( ... numberOfRowsInSection ... )
override func tableView( ... cellForRowAt ... )
在实践中,我可以毫无问题地使用它们,但我将不胜感激任何澄清或指向可以解释的参考资料:
- 为什么
UIKit
方法结构如此,而不是专用的
func tableViewNumberOfRowsInSection( ... )
func tableViewCellForRowAt( ... )
(或者,为什么不把numberOfRowsInSection
作为UITableViewController
的子类的一个属性,而不是一个看起来有上百种用途的函数(tableView)的一个参数呢?)
Function/Method 标签、参数名称等基础知识对我来说非常有意义,但我似乎无法理解为什么 func tableView 会按现在的方式构建。
- tableView 的最终调用是什么样的?
在此先感谢您的帮助或指点!
我不会在这个答案中详细介绍,但 UIKit 中的委托方法(就像你展示的那些)确实很长,而且几乎不可能不输入来自 auto-complete 的帮助。 我认识的人都没有记住所有这些(我尝试过,但失败了)。
之所以存在,是因为 UIKit 本身是由 Apple 在 Objective-C 中编写的。 如果 UIKit 在今天 Swift 被重写(这永远不会发生,因为 Apple 多年来在框架上投入了大量精力,SwiftUI),API 可能会更好地遵循 Swift API 设计的做法。
具体回答您的问题:
这就是它们一直以来的方式——如果对它们进行任何更改,将会破坏很多开发人员的源代码。可以说,您提出的那种方法签名并没有更好,只是有所不同。此外,如果您阅读了完整的方法签名,它们确实有意义并且足够清晰。
查看
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 发布之前),其中他们的 selectors 是 tableView:numberOfRowsInSection:
和 tableView:cellForRowAtIndexPath:
。这可能不那么令人困惑,因为第一个参数标签在括号外没有“特权”。也就是说,根据 Swift 的命名标准,它仍然被认为是一个好的设计,至少只要设计需要使用 类(如果它不必支持 [,它可能不会) =27=]).