Swift中函数的无效重新声明

atr*_*eat 1 compiler-errors function swift

我正在尝试编写一些辅助函数,并且正在获得某些类似方法的"无效重新声明"错误.如果有人能解释为什么这些方法发生碰撞,我会非常感激.

func CGRectModify(rect: CGRect, x: CGFloat) -> CGRect {
    return CGRectMake(x, rect.origin.y, rect.size.width, rect.size.height)
}

func CGRectModify(rect: CGRect, y: CGFloat) -> CGRect {
    return CGRectMake(rect.origin.x, y, rect.size.width, rect.size.height)
}

func CGRectModify(rect: CGRect, width: CGFloat) -> CGRect {
    return CGRectMake(rect.origin.x, rect.origin.y, width, rect.size.height)
}

func CGRectModify(rect: CGRect, height: CGFloat) -> CGRect {
    return CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, height)
}
Run Code Online (Sandbox Code Playgroud)

我认为因为第二个参数具有不同的外部名称,所以该方法将被理解为具有不同的签名.似乎并非如此.

我一直在使用Apple的文档作为参考,但在方法本地和外部参数名称部分我找不到我的答案.任何输入都非常感谢.

rin*_*aro 6

函数的"自动外部参数名称"规则与方法不同.

Swift应用不同的规则取决于callables的类型.

  1. 功能/闭包文档

    不执行"自动外部参数名称".

    func f(x:Int, y:Int) { /* ... */ }
    let c =  { (x:Int, y:Int) -> Void in /* ... */ }
    
    f(1, 2)
    c(1, 2)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 初始化器文件

    "自动外部参数名称"是每个参数的默认值.

    class Foo {
        init(x:Int, y:Int) { /* ... */ }
    }
    
    let foo = Foo(x: 1, y: 2)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 方法文件

    "自动外部参数名称" 第一个参数外.

    extension Foo {
        func bar(x:Int, y:Int) { /* ... */ }
    }
    
    foo.bar(1, y:2)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 下标 →文件遗失?

    不执行"自动外部参数名称".

    extension Foo {
        subscript(x:Int, y:Int) -> Void {
            get { /* ... */ }
        }
    }
    
    foo[1, 2]
    
    Run Code Online (Sandbox Code Playgroud)

对...的特殊规则

当然,您可以使用以下方法覆盖这些默认行为

  • _ name:Type:禁用"自动外部参数名称"
  • #name:Type:强制"自动外部参数名称"
  • externalName internalName:Type:显式外部名称