关于ios:两个类似的方法如何在ViewController中共存?

How can two similar methods coexist in a ViewController?

在viewController类中,我有两个mapView函数:

第一个mapview函数处理重叠(如线条、地图上的形状等)。

1
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer

第二个mapview函数处理地图上的注释和针脚

1
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?

从C/python背景来看,我不理解如何拥有两个同名的函数,并且它们不会互相覆盖。这个过程背后的想法是什么?


对不起,保罗·马托斯的回答是错的。

函数重载确实存在于swift中;当两个函数具有相同的名称但签名不同时,这意味着参数/返回类型不同。因此,这是合法的:

1
2
func f(x:Int) {}
func f(x:String) {}

这是合法的,因为斯威夫特可以根据你为x提供的价值来判断你呼叫的是哪一个。这是超载。

但你的问题与此无关。你的问题是关于这种情况:

1
2
func f(x:Int) {}
func f(y:Int) {}

这只是两个完全不同的功能。第一个叫f(x:),第二个叫f(y:)。它们是不同的,就好像我说了"以东十一〔6〕和"以东十七〔7〕一样。他们有完全不同的名字。

所以,外卖是:

  • 参数标签是名称的一部分。具有不同名称的函数(考虑到参数标签)从未被怀疑过。

  • 具有相同名称但不同参数/返回类型的函数也是合法的;即重载,这在您的问题中没有出现。


它们不一样。第一个应该读作mapviewrenderfor(mapview,overlay)。第二个是mapviewviewfor(mapview,annotation)

_这不是一件棘手的事,但要让第一次敏捷的人很难解释清楚。考虑函数

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

在目标C中,

1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Objective-C和Swift以这种方式在声明中包含参数的详细描述。一开始可能会让人困惑,但在你习惯了之后,它就变得可读起来了。它使API易于使用。例如,一个假设的Java函数(我在Java中很弱)将一个目标添加到一个按钮会是这样的:

1
button.add(this,didTapButton(),touchUpInside)

将此代码与swift代码进行比较:

1
button.addTarget(self, action: #selector(didTapDimensionButton), for: UIControlEvents.touchUpInside)


在编程语言理论中,这通常被称为函数重载。在swift语言中,除其他语言外,函数通过其名称和参数(即类型和参数标签)进行唯一标识。此函数标识有时称为函数签名。请注意,函数返回类型不是所述签名的一部分。

例如,以下所有Swift功能完全不同:

1
2
3
4
5
6
func run()
func run(x: Int)
func run(y: Int)
func run(_ x: Int)
func run(_ y: Float)
func run(x: Int, y: Int)

因此,run函数被许多变量重载,因此功能名。

但这两者相同,将触发编译器错误:

1
2
func run(_ x: Int)
func run(_ y: Int)

这两个函数共享相同的签名,因为:没有为其唯一的arg提供arg标签(_执行此技巧),而唯一的arg具有相同的类型(Int)。

此功能也可在C++、C语言和Java中使用。但是在这些语言中,arg名称不是函数签名的一部分,只有arg类型是。正如你可能猜到的,这是那些来斯威夫特的人反复出现的困惑之源。

相反,您提到的C语言和Python语言不支持重载,这可能解释了您的小困惑:)

最后,经典的ADA编程语言支持与swift非常相似的函数重载机制。