【问题标题】:How do I interpret a Swift function declaration? [duplicate]如何解释 Swift 函数声明? [复制]
【发布时间】:2018-07-19 20:07:25
【问题描述】:

我对此声明有疑问:

internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

internal是作用域?

func是声明方法/函数的关键字?

tableView是方法名?

_tableView 是什么?这是参数的名称吗?如果是这样,当cellForRowAt 没有下划线时,为什么我们需要下划线,假设cellForRowAt 也是一个名称?

UITableView 是参数类型吗?

IndexPath 是参数类型吗?

cellForRowAt indexPath 中的indexPath 是什么?为什么有2个字?

UITableViewCell 是返回类型,对吧?

很困惑,非常感谢您的帮助!

【问题讨论】:

  • 这个问题没什么问题,但是如果你在这个级别的语言上遇到问题,你最好寻找更多的介绍性材料,比如The Swift Programming Language
  • 请阅读 Swift 书的Functions 章节(以及本书的其余部分)。

标签: ios swift uitableview syntax


【解决方案1】:

internal是作用域?

这是一个访问修饰符。这意味着只有同一模块中的代码才能看到/调用这个符号。

internal 是隐含的,如果你不使用它,它主要在你制作框架时有意义——链接框架的应用程序只能看到框架的 public 符号,但框架内的代码可以看到其他internal 框架中的符号。 (并且框架中一种类型的代码在另一种类型中看不到private 符号。)

func是声明方法/函数的关键字?

是的。在 Swift 中,“方法”只是在类型(类、结构、协议、枚举)范围内声明的 function。

tableView是方法的名字?

是的……在某种意义上。它通常被称为函数/方法的“基本名称”——开括号 ( 之前的部分。该方法的全名(人们在试图明确地引用此方法与其他方法时使用)包括所有参数标签:tableView(_:cellForRowAt:)。 (不过,在 Swift 中,即使是全名也不是明确的,因为函数/方法可以在参数/返回类型上重载。)

通常,函数名称是一个动词短语,描述函数执行的操作或表征结果,但在委托/数据源协议中另有一个长期约定。 (并且此方法来自UITableViewDataSource 协议。)在此类协议中,函数的“基本名称”用于命名委托某些操作的对象。

_tableView 是什么?这是参数的名称吗?如果是这样,假设cellForRowAt 也是一个名称,为什么cellForRowAt 没有下划线,我们还需要下划线?

不是_tableView,而是_ tableView——注意空格。 The underscore generally means "ignore this" in Swift. 在这种情况下,下划线代替了参数标签,这意味着该方法的调用者不会为第一个参数写一个:

let cell = tableView(myTableView, cellForRowAt: selectedIndexPath)
                    ^ nothing here, just the value being passed as an argument

UITableView 是参数类型吗? IndexPath是参数类型吗?

是的。

cellForRowAt indexPath 中的 indexPath 是什么?为什么有2个字?

cellForRowAt 是一个参数标签indexPath 是参数的内部(对于您的实现)名称。

参数标签由调用你的函数的人使用——例如一个这样的呼叫站点如下所示:

let cell = tableView(myTableView, cellForRowAt: selectedIndexPath)

参数名称是您在函数体内引用该值的方式:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    self.doSomethingWithCellData(indexPath)
    ...
}

UITableViewCell 是返回类型,对吧?

没错。如果您在此方法的实现中未包含 return 语句,或 return 任何不是 UITableViewCell 的内容,编译器会感到不安。

【讨论】:

  • 这个答案部分不正确。函数的名称不是tableView。函数名称为tableView(_:cellForRowAt:)
  • 作为某位吟游诗人once implied,“名字”是一个流动的概念。 :) 编辑以阐明基本名称与全名。
【解决方案2】:

您对internalfunctableView 的看法是正确的。有下划线是因为在调用函数时不必包含参数名称。你可以这样做:

tableView(myTableView, cellForRowAt: someIndexPath)

代替:

tableView(tableView: myTableView, cellForRowAt: someIndexPath)

UITableView 是与IndexPath 相同的参数类型。当函数被调用时(如上所示),您使用第一个单词cellForRowAt,但在内部函数将使用indexPath。调用函数时,这两个词是为了便于阅读。 UITableViewCell 是返回类型。

【讨论】:

  • 都是真的,虽然“你”(通常)从不调用这个函数,你只是实现它。在委托协议中,UIKit 调用你!
  • 这是一个很好的澄清点@rickster
  • 这个答案部分不正确。函数的名称不是tableView。函数名称为tableView(_:cellForRowAt:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 2021-11-03
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多