两个类似的方法如何在ViewController中共存?

时间:2017-04-30 21:45:42

标签: ios swift swift3 overloading

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

第一个mapView函数处理叠加层(如地图上的线条,形状等)

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

并且第二个mapView函数处理地图上的注释和引脚

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

来自C / Python背景,我不明白你如何拥有两个命名相同的函数,并且它们不会相互覆盖。这个过程背后的想法是什么?

3 个答案:

答案 0 :(得分:5)

对不起,但保罗马托斯的答案是错的。

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

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

这是合法的,因为Swift可以根据您为x提供的价值来判断您正在调用哪一个。那是超载。

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

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

这些只是两个完全不同的功能。第一个称为f(x:),第二个称为f(y:)。它们就像我说过fg一样不同。它们具有完全不同的名称

所以,外卖是:

  • 参数标签是名称的一部分。具有不同名称的功能(将参数标签考虑在内)从不存在疑问。

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

答案 1 :(得分:1)

他们不一样。第一个应该被读作mapViewRendererFor(mapView,overlay)。 第二个是mapViewViewFor(mapView,annotation)

_并不棘手,但要让第一次更快的解释它很难。 考虑函数

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

在Objective-C中,它是

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

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

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

将此与Swift Code进行比较:

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

答案 2 :(得分:0)

这在编程语言理论中通常被称为 function overloading 。在Swift中,在其他语言中,函数由其名称​​和参数(即类型和参数标签)唯一标识。此功能标识有时称为功能签名。请注意,函数返回类型不是所述签名的一部分。

例如,下面的所有Swift函数都完全不同:

Edit Movie

因此,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

两个函数共享相同的签名,因为:没有为其唯一的arg提供arg标签(func run(_ x: Int) func run(_ y: Int) 执行此操作)唯一的arg具有相同的类型({{1 }})。

此功能也可用于C ++,C#和Java。但在这些语言中,arg名称是不是函数签名的一部分,只有arg类型。正如您可能猜到的那样,对于那些来到Swift的人来说,这是一个经常出现混乱的根源。

相反,您提到的C和Python语言不支持重载,这可能解释您的轻微混淆:)

最后,经典Ada programming language支持与Swift非常类似的函数重载机制。