为什么swift协议使用func重载而不是使用不同名称的func?

时间:2017-07-19 18:46:11

标签: ios swift swift-protocols

刚开始学习swift并注意到协议UICollectionViewDelegate(https://developer.apple.com/documentation/uikit/uicollectionviewdelegate) 有大约20个具有相同名称但参数不同的函数。 在C#中我们也使用重载,但是我们使用它们以防我们想要做类似的事情:

  • GetUser(int id)
  • GetUser(string userName)

但是在swift中,我们对执行绝对不同的函数使用相同的函数名称:

  • func collectionView(UICollectionView,didSelectItemAt:IndexPath)
  • func collectionView(UICollectionView, targetContentOffsetForProposedContentOffset:CGPoint)

所以问题是,为什么他们不使用像这样的函数:

  • func didSelect(UICollectionView,ItemAt:IndexPath)
  • func targetContentOffsetForProposedContentOffset(UICollectionView, offset:CGPoint)

在这种情况下,func名称实际告诉我们它将要做什么,并且更容易找到你需要的功能

如果有一些文件说明为什么做出这样的决定,我会非常感激。

谢谢

2 个答案:

答案 0 :(得分:1)

因此在swift中,函数名实际上被分解为名称所描述的每个参数旁边。这个惯例的根源在于objective-c。

所以上面显示的那些函数实际上有不同的名称,名称就是分解。

所以

collectionView(UICollectionView, didSelectItemAt: IndexPath)

是collectionView: didSelectItemAt:

func collectionView(UICollectionView, targetContentOffsetForProposedContentOffset: CGPoint)

是collectionView:_ targetContentOffsetForProposedContentOffset:_

这是一个非常具有描述性的命名惯例。请记住,函数的名称被拆分为名称片段描述的每个参数的旁边。

答案 1 :(得分:1)

它与Objective C的工作方式有关,如果将这些函数编写为选择器,它将类似于"collectionView:didSelectItemAt:"。这隐含地告诉你它与collectionView有关,并且不会与"tableView:didSelectItemAt:"混淆。

另一方面,如果名为"didSelect:itemAt:"的函数,它没有提供关于第一个参数是什么的任何提示,它可以是tableView,collectionView或其他任何东西,因为目标c不支持超载,这将成为一个问题。