How can two similar methods coexist in a ViewController?
在viewController类中,我有两个
第一个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) {} |
。
这是合法的,因为斯威夫特可以根据你为
但你的问题与此无关。你的问题是关于这种情况:
1 2 | func f(x:Int) {} func f(y:Int) {} |
这只是两个完全不同的功能。第一个叫
所以,外卖是:
参数标签是名称的一部分。具有不同名称的函数(考虑到参数标签)从未被怀疑过。
具有相同名称但不同参数/返回类型的函数也是合法的;即重载,这在您的问题中没有出现。
它们不一样。第一个应该读作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) |
因此,
但这两者相同,将触发编译器错误:
1 2 | func run(_ x: Int) func run(_ y: Int) |
。
这两个函数共享相同的签名,因为:没有为其唯一的arg提供arg标签(
此功能也可在C++、C语言和Java中使用。但是在这些语言中,arg名称不是函数签名的一部分,只有arg类型是。正如你可能猜到的,这是那些来斯威夫特的人反复出现的困惑之源。
相反,您提到的C语言和Python语言不支持重载,这可能解释了您的小困惑:)
最后,经典的ADA编程语言支持与swift非常相似的函数重载机制。