不同的功能如何具有相同的名称?

时间:2016-08-20 15:25:49

标签: swift cocoa

来自Apple's documentation

  

回应位置事件

func locationManager(CLLocationManager, didUpdateLocations: [CLLocation])
     

告诉代表新的位置数据可用。

func locationManager(CLLocationManager, didFailWithError: Error)
     

告诉代理人位置管理员无法检索   位置价值。

func locationManager(CLLocationManager, didFinishDeferredUpdatesWithError: Error?)
     

告诉代理人不再推迟更新。

func locationManager(CLLocationManager, didUpdateTo: CLLocation, from: CLLocation)
     

告诉代理人一个新的位置值可用。


我有一段代码看起来像:

ViewController.swift

class ViewController:UIViewController, CLLocationManagerDelegate {

    [...]

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        [...]

    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        [...]
    }

    [...]
}

我怎样才能在同一个类中拥有两个具有相同名称但以独立方式调用的函数,具体取决于传递的参数?在其他编程语言中,afaik你不能那样做。

3 个答案:

答案 0 :(得分:3)

在Swift中,参数名称和类型是函数名称的一部分。因此,在您的示例中,函数的命名方式不同,因为参数不同。

这就是您在the documentation中看到方法名称中包含的参数名称的原因,例如:

locationManager(_:didUpdateLocations:)
locationManager(_:didFailWithError:)
locationManager(_:didFinishDeferredUpdatesWithError:)

此外,即使参数名称相同,如果它们的类型不同,也允许这样做。一个简单的例子:

class Greeter {
    func greet(arg: Int) -> String {
        if (arg < 12) {
            return "Good morning!"
        } else if (arg < 18) {
            return "Good afternoon!"
        } else {
            return "Good evening!"
        }
    }

    func greet(arg: String) -> String {
        return "Hello, \(arg)."
    }
}

在此示例中,您可以调用Greeter().greet(4)Greeter().greet("Aaron"),控件将转到相应的函数。

答案 1 :(得分:1)

它被称为“function overloading”(或“方法重载”),具有多个具有相同名称的功能/方法,这些功能/方法通过其签名(其参数的数量和类型)进行区分)。它在编程语言中很常见,包括C ++,Java,C#和显然是Swift。

如何在封面下处理重载因语言而异。例如,最近我看过(很久以前),C ++使用 name mangling - 函数的实际名称是通过获取基本名称并向其添加内容来创建的,以指示参数的类型。 (非常早期,C ++是一个输出C代码的预处理器。)Java不需要这样做,因为它是在考虑重载的情况下构建的。但是在我们处理它们的高级别,函数具有相同的名称。

答案 2 :(得分:0)

功能过载。 c ++,可以做到。

编辑:

确定。我添加了更多细节。对不起,我是编程新手。我害怕给出错误的答案。

func foo1(_ x: Int) {
    print("the argument is Int")
}
func foo1(_ x: Double) {
    print("the argument is Double")
}

// it depends the type of the value to pass to the function.
foo1(3) // print "the argument is Int"
foo1(4.7) // print "the argument is Double"

// when you assign the function to a variable,
// and there are other functions with the same name and same parameter names, 
// then, you have to tell the type of the function explicitly.
let pToFunc1: (Int) -> Void = foo1

// but normally, you can assign it without telling the type.
func foo2(x: Int){}
let pToFunc2 = foo2

// but same function name with different parameter names,
// when you assign this function, you need to tell the parameter explicitly.  
func foo3(x: Int){}
foo3(x: 4)
func foo3(y: Int){}
foo3(y: 5)
let pToFunc3 = foo3(x:)