Ios 两种类似的方法如何在ViewController中共存?
在ViewController类中,我有两个Ios 两种类似的方法如何在ViewController中共存?,ios,swift,swift3,overloading,Ios,Swift,Swift3,Overloading,在ViewController类中,我有两个mapView函数: 第一个mapView函数处理覆盖(如地图上的线条、形状等) 第二个mapView函数处理地图上的注释和图钉 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 来自C/Python背景,我不明白如何让两个函数命名相同,并且它们不会相互覆盖。这个过程背后的想法是什么?它们不一样。第一个应读作MapV
mapView
函数:
第一个mapView函数处理覆盖(如地图上的线条、形状等)
第二个mapView函数处理地图上的注释和图钉
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
来自C/Python背景,我不明白如何让两个函数命名相同,并且它们不会相互覆盖。这个过程背后的想法是什么?它们不一样。第一个应读作MapViewRenderfor(mapView,overlay)。 第二个是MapViewfor(mapView,注释) _这并不棘手,但很难向第一次跑得快的人解释。 考虑函数
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代码进行比较:
button.addTarget(self, action: #selector(didTapDimensionButton), for: UIControlEvents.touchUpInside)
这在编程语言理论中经常被称为。在Swift等语言中,函数由其名称和参数(即类型和参数标签)唯一标识。这种函数标识有时称为函数签名。请注意,函数返回类型不是上述签名的一部分
例如,以下所有Swift功能完全不同:
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
函数重载了许多变体,因此使用了功能名称
但这两者相同,将触发编译器错误:
func run(_ x: Int)
func run(_ y: Int)
这两个函数共享相同的签名,因为:没有为其唯一的arg提供arg标签(该\uu
执行此操作),并且唯一的arg具有相同的类型(Int
)
这种能力也可以用C++,C,和java来实现。但是在这些语言中,arg名称不是函数签名的一部分,只有arg类型是。正如你可能猜到的,对于那些来到斯威夫特的人来说,这是一个反复出现的困惑源
相反,您提到的C和语言不支持重载,这可能解释了您的小困惑:)最后,经典版支持与Swift非常相似的函数重载机制。对不起,保罗·马托斯的答案是错误的 Swift中确实存在函数重载;这是指两个函数名称相同但签名不同,这意味着参数/返回类型不同。因此,这是合法的:
func f(x:Int) {}
func f(x:String) {}
这是合法的,因为Swift可以根据您为x
提供的值来判断您正在呼叫哪一个。这是超载
但你的问题和这个无关。你的问题是关于这种情况:
func f(x:Int) {}
func f(y:Int) {}
这只是两个完全不同的功能。第一个称为f(x:)
,第二个称为f(y:)
。它们就像我说的f
和g
一样不同。他们有完全不同的名字
因此,外卖是:
- 参数标签是名称的一部分。具有不同名称的函数(将参数标签考虑在内)从未被怀疑过
- 名称相同但参数/返回类型不同的函数也是合法的;这是超载,这在你的问题中没有出现
func-run(x:Int)
和func-run(y:Int)
在技术上是否相同?除非参数名称是必需的(这将使计算机更容易识别它应该使用哪一个)。由于Swift 3,默认情况下参数标签是必需的。因此,函数run(x:Int)
和run(y:Int)
实际上并不相同-调用者提供的参数名将有助于选择正确的参数。@adib我对答案做了一些改进。请让我知道现在是否更好…看起来不错!我还尝试了func run(*)来看看会发生什么。再次感谢您的解释@matt抱歉,但这实际上在编程语言理论中被称为,并不总是一门精确的科学(人们可能会加上:)例如,Ada在很久以前就支持这种快速重载风格。话虽如此,我特别同意你对Swift的看法。鉴于其Objective-C继承,它将函数名与(外部)参数名合并,创建一个完全不同的实体-一个自身唯一的实体,不需要重载,因此产生混淆;-)这解释了苹果使用greet(person:)
来命名函数而不是greet
的文档。这仍然是一种奇怪的行为。不过,多亏了@Paulo,我才学会了函数重载。但这种行为是斯威夫特独有的吗?由于在维基百科()上,使用C++示例,Paolo在使用不同参数名称时是绿色的(或者我需要更多地了解这个)。我尝试过,在一些成功的情况下,将好的“ADIB”引入到函数重载的整体概念中,这在整体的方案中是很重要的。在这样做的过程中,我没有提到Matt在这里强调的重要区别,即并非我所有的例子都不是technica
func f(x:Int) {}
func f(y:Int) {}