Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 两种类似的方法如何在ViewController中共存?_Ios_Swift_Swift3_Overloading - Fatal编程技术网

Ios 两种类似的方法如何在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

在ViewController类中,我有两个
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
一样不同。他们有完全不同的名字

因此,外卖是:

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

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


查看有关函数()的文档后,函数名为mapView(在您的示例中为tabletView)的格式似乎仍然合理。你表达的这个方法叫做函数吗?或者它会被命名为其他名称吗?我建议您阅读“函数参数标签和参数名称”部分。要回答您的问题,再次说明,它不是mapview(),而是(a,b)的MapViewRenderer。这并不是说2个mapView函数都是重载函数,这解释了很多!如果我正确理解了这一点,如果存在函数重载,系统就会识别出所述函数中的哪些满足提供的参数。在您给出的示例中,
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) {}