【问题标题】:What exactly differentiate two functions in Swift?究竟是什么区分了 Swift 中的两个函数?
【发布时间】:2025-12-05 07:30:01
【问题描述】:

我想知道是什么让两个“相似的函数”彼此不同并且可以明确地调用

这是我从自学中学到的

唯一性来自:函数名+参数顺序和参数名+返回类型。它们的组合必须是唯一的才能使函数具有唯一性(请参见下面的示例)

  1. Nmu1Num2会造成歧义,因为调用函数时没有引用返回类型(没有所谓的返回名,函数名已经充当了这个角色)

  2. 虽然Num3函数有不同的参数名称,但它不会将它与Num1Num2中的函数唯一区分开来。因为在调用函数时不会引用参数名称,所以只有不同的参数名称不会使函数唯一;而Num4中的函数与上面的所有函数都不一样,因为它的签名函数名+参数顺序和参数名+返回类型在前面3个函数中是唯一的。

  3. Num5Num6 函数彼此不同,因为它们在定义时具有不同的参数顺序

    //Num1
    func foo(guy name: String) -> String {
         return "Hi \(name)"
    }
    
    //Num2
    func foo(guy name: String) {
        print("Hi \(name)")
    }
    
    //Num3
    func foo(guy called: String) -> String {
        return "Hi \(called)"
    }
    
    //Num4
    func foo(dude name: String) -> String {
        return "What's up \(name)"
    }
    
    //Num5
    func foo(man name: String, from place: String) {
       print("Hi! I'm \(name) I come from \(place)")
    }
    
    //Num6
    func foo(from place: String, man name: String) {
       print("Hi! I'm \(name) I come from \(place)")
    }
    

问题:我可能会遗漏甚至可能误解了某些部分。如果你能纠正我并添加我遗漏的部分,那将是非常好的

谢谢

[更新] 让我们就这个问题进行更多讨论。让我们从讨论the difference between Argument and Parameter 的问题开始。这个问题在这里很有意义!

回到swift官方文档中的引用

每个函数参数都有一个参数标签和一个参数名称。调用函数时使用参数标签;每个参数都写在函数调用中,前面有参数标签。参数名称用于函数的实现。默认情况下,参数使用参数名称作为参数标签。

参数、参数、参数标签和参数名称是不同的。这里的差异可以用于微分函数。

参数名称相同、参数顺序相同、返回类型相同甚至函数体相同的函数可以通过不同的参数标签进行区分。

func foo(dude name: String) -> Int {
    print("Hi \(name)!")
    return 1
}

func foo(man name: String) -> Int {
    print("Hi \(name)!")
    return 1
}

//foo(dude: String) & foo(man: String) is identical when calling 

欲了解更多信息,请联系Multiple functions with the same name

【问题讨论】:

标签: swift function


【解决方案1】:

定义为兼容Obj-C的方法,Num1和Num2不能同时存在,在NSObject子类中定义会出错;但是,您可以将它们标记为 @nonobjc 并且错误将消失,因为 Swift 能够通过预期的返回类型选择正确的重载:

//Num1
@nonobjc func foo(guy name: String) -> String {
     return "Hi \(name)"
}

//Num2
@nonobjc func foo(guy name: String) {
    print("Hi \(name)")
}

你的所有其他观点,除了这个标记,对我来说似乎都是正确的

【讨论】: