在ViewController类中,我有两个mapView
函数:
第一个mapView函数处理叠加层(如地图上的线条,形状等)
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
并且第二个mapView函数处理地图上的注释和引脚
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
来自C / Python背景,我不明白你如何拥有两个命名相同的函数,并且它们不会相互覆盖。这个过程背后的想法是什么?
答案 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:)
。它们就像我说过f
和g
一样不同。它们具有完全不同的名称。
所以,外卖是:
参数标签是名称的一部分。具有不同名称的功能(将参数标签考虑在内)从不存在疑问。
具有相同名称但不同参数/返回类型的函数也是合法的; 正在超载,这在你的问题中没有出现。
答案 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非常类似的函数重载机制。