为什么 swift 协议使用 func 重载而不是在具有不同名称的 func 上?
Why swift protocol use func overloading instead on func with different names?
刚开始学习swift,注意到协议UICollectionViewDelegate(https://developer.apple.com/documentation/uikit/uicollectionviewdelegate)
有大约 20 个同名但参数不同的函数。
在 C# 中,我们也使用重载,但我们使用它们以防我们想要做类似的事情,例如:
- GetUser(int id)
- GetUser(字符串用户名)
但在 swift 中,我们对功能完全不同的功能使用相同的功能名称,例如:
- func collectionView(UICollectionView, didSelectItemAt: IndexPath)
- func collectionView(UICollectionView,
targetContentOffsetForProposedContentOffset: CGPoint)
所以问题是,为什么他们不使用像这样的函数:
- func didSelect(UICollectionView, ItemAt: IndexPath)
- func targetContentOffsetForProposedContentOffset(UICollectionView,
偏移量:CGPoint)
在这种情况下,函数名称实际上告诉我们它将要做什么,并且更容易找到您需要的函数
如果有一些文档说明为什么做出这样的决定,我将不胜感激。
谢谢
所以在 swift 中,函数名称实际上被分解到名称所描述的每个参数旁边。该约定源于 objective-c。
所以你上面显示的那些函数实际上有不同的名称,名称只是被打散了。
所以
collectionView(UICollectionView, didSelectItemAt: IndexPath)
是collectionView:didSelectItemAt:
func collectionView(UICollectionView, targetContentOffsetForProposedContentOffset: CGPoint)
是collectionView:_targetContentOffsetForProposedContentOffset:_
这是一个非常具有描述性的命名约定。请记住,函数的名称被拆分为名称部分所描述的每个参数的旁边。
这跟Objective C的工作方式有关,如果你把这些函数写成选择器,它会像"collectionView:didSelectItemAt:"
。这隐含地告诉你它与 collectionView 有关,并且不会与 "tableView:didSelectItemAt:"
.
混淆
另一方面,如果函数名为 "didSelect:itemAt:"
,它不会提供任何关于第一个参数是什么的提示,它可以是 tableView、collectionView 或其他任何东西,因为 objective c 没有支持过载,这个会出问题
刚开始学习swift,注意到协议UICollectionViewDelegate(https://developer.apple.com/documentation/uikit/uicollectionviewdelegate) 有大约 20 个同名但参数不同的函数。 在 C# 中,我们也使用重载,但我们使用它们以防我们想要做类似的事情,例如:
- GetUser(int id)
- GetUser(字符串用户名)
但在 swift 中,我们对功能完全不同的功能使用相同的功能名称,例如:
- func collectionView(UICollectionView, didSelectItemAt: IndexPath)
- func collectionView(UICollectionView, targetContentOffsetForProposedContentOffset: CGPoint)
所以问题是,为什么他们不使用像这样的函数:
- func didSelect(UICollectionView, ItemAt: IndexPath)
- func targetContentOffsetForProposedContentOffset(UICollectionView, 偏移量:CGPoint)
在这种情况下,函数名称实际上告诉我们它将要做什么,并且更容易找到您需要的函数
如果有一些文档说明为什么做出这样的决定,我将不胜感激。
谢谢
所以在 swift 中,函数名称实际上被分解到名称所描述的每个参数旁边。该约定源于 objective-c。
所以你上面显示的那些函数实际上有不同的名称,名称只是被打散了。
所以
collectionView(UICollectionView, didSelectItemAt: IndexPath)
是collectionView:didSelectItemAt:
func collectionView(UICollectionView, targetContentOffsetForProposedContentOffset: CGPoint)
是collectionView:_targetContentOffsetForProposedContentOffset:_
这是一个非常具有描述性的命名约定。请记住,函数的名称被拆分为名称部分所描述的每个参数的旁边。
这跟Objective C的工作方式有关,如果你把这些函数写成选择器,它会像"collectionView:didSelectItemAt:"
。这隐含地告诉你它与 collectionView 有关,并且不会与 "tableView:didSelectItemAt:"
.
另一方面,如果函数名为 "didSelect:itemAt:"
,它不会提供任何关于第一个参数是什么的提示,它可以是 tableView、collectionView 或其他任何东西,因为 objective c 没有支持过载,这个会出问题