【问题标题】:Swift / UIKit: understanding the structure of built-in methodsSwift / UIKit:了解内置方法的结构
【发布时间】:2020-09-15 16:12:53
【问题描述】:

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

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

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

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

  1. 为什么UIKit 方法的结构是这样的,而不是有一个专门的
func tableViewNumberOfRowsInSection( ... )
    
func tableViewCellForRowAt( ... )

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

诸如标签、参数名称等功能/方法基础知识对我来说非常有意义,但我似乎无法理解为什么 func tableView 会按照它的方式构造。

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

提前感谢任何帮助或指点!

【问题讨论】:

    标签: ios swift uikit tableview


    【解决方案1】:

    它们不是以不同方式使用的同一个函数——它们是完全不同的函数,因为参数标签是函数名称的一部分。每个函数的全名是tableView(_:numberOfRowsInSection:)tableView(_:cellForRowAt:),您可以在the documentation 中看到。您可能还想阅读this guide函数参数标签和参数名称部分,也许还有naming guidelines

    您不太可能自己调用​​这些方法,因为它们的存在是为了向表格视图本身提供数据。 UITableView 将在内部调用您的方法,类似于dataSource.tableView(self, cellForRowAt: indexPath)。有关此模式的更多信息,请参阅Protocols guide 中的委托部分。

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

    【讨论】:

      【解决方案2】:

      我不会在这个答案中介绍太多细节,但确实来自 UIKit 的委托方法(如您展示的那些)往往很长,并且几乎不可能在没有自动完成帮助的情况下输入。 我认识的人没有人记住所有这些(我尝试过,但失败了)。

      由于 UIKit 本身是由 Apple 用 Objective-C 编写的,因此有些遗留问题。 如果今天要用 Swift 重写 UIKit(这将永远不会发生,因为 Apple 多年来在框架上投入的大量精力以及 SwiftUI 的兴起),API 很可能会更好地遵循 Swift API 设计实践。

      具体回答您的问题:

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

      2. 查看UITableView 的一些教程。您展示的方法来自UITableViewDelegate,这是您用来从代码配置表格的“胶水”。这是因为在早期的 Objective-C 时代,进行这种自定义的唯一方法是通过这种“委托模式”。

      【讨论】:

        猜你喜欢
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        • 2019-10-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        相关资源
        最近更新 更多