Function Swift中函数的重新声明无效

Function Swift中函数的重新声明无效,function,swift,compiler-errors,Function,Swift,Compiler Errors,我试图编写一些助手函数,但得到了一些类似方法的“无效重新声明”错误。如果有人能解释为什么这些方法会发生冲突,我将非常感激 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) -> CG

我试图编写一些助手函数,但得到了一些类似方法的“无效重新声明”错误。如果有人能解释为什么这些方法会发生冲突,我将非常感激

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)
}
我认为,由于第二个参数具有不同的外部名称,因此该方法将被理解为具有不同的签名。看来情况并非如此


我一直在使用苹果的文档作为参考,但在文章的部分我找不到我的答案。非常感谢您的任何意见

这实际上看起来像文档中的一个bug。在我最初链接到的部分中,写了以下解释

此默认行为有效地将方法视为在numberOfTimes参数之前写入了哈希符号(#):

func incrementBy(amount: Int, #numberOfTimes: Int) { 
      count += amount * numberOfTimes
}
事实并非如此。当我将哈希符号(#)添加到第二个参数时,不会发生编译器错误

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

这实际上看起来像文档中的一个bug。在我最初链接到的部分中,写了以下解释

此默认行为有效地将方法视为在numberOfTimes参数之前写入了哈希符号(#):

func incrementBy(amount: Int, #numberOfTimes: Int) { 
      count += amount * numberOfTimes
}
事实并非如此。当我将哈希符号(#)添加到第二个参数时,不会发生编译器错误

func CGRectModify(rect: CGRect, #height: CGFloat) -> CGRect {
    return CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, height)
}
函数的“自动外部参数名”规则与方法不同

Swift根据可调用项的类型应用不同的规则

  • 函数/闭包

    不执行“自动外部参数名称”

    func f(x:Int, y:Int) { /* ... */ }
    let c =  { (x:Int, y:Int) -> Void in /* ... */ }
    
    f(1, 2)
    c(1, 2)
    
    extension Foo {
        subscript(x:Int, y:Int) -> Void {
            get { /* ... */ }
        }
    }
    
    foo[1, 2]
    
  • 初始化者

    “自动外部参数名称”是每个参数的默认值

    class Foo {
        init(x:Int, y:Int) { /* ... */ }
    }
    
    let foo = Foo(x: 1, y: 2)
    
  • 方法

    “自动外部参数名称”,第一个参数除外

    extension Foo {
        func bar(x:Int, y:Int) { /* ... */ }
    }
    
    foo.bar(1, y:2)
    
  • 下标→ 文件丢失

    不执行“自动外部参数名称”

    func f(x:Int, y:Int) { /* ... */ }
    let c =  { (x:Int, y:Int) -> Void in /* ... */ }
    
    f(1, 2)
    c(1, 2)
    
    extension Foo {
        subscript(x:Int, y:Int) -> Void {
            get { /* ... */ }
        }
    }
    
    foo[1, 2]
    
  • 还有一个特殊的规则

    • 默认值

      func fz(x:Int, y:Int, z:Int = 1) { /* ... */ }
      
      fz(1, 1, z: 1)
      
    当然,您可以使用以下方法覆盖这些默认行为:

    • 名称:键入
      :禁用“自动外部参数名称”
    • #名称:键入
      :强制“自动外部参数名称”
    • 外部名称内部名称:类型
      :显式外部名称
    函数的“自动外部参数名称”规则与方法不同

    Swift根据可调用项的类型应用不同的规则

  • 函数/闭包

    不执行“自动外部参数名称”

    func f(x:Int, y:Int) { /* ... */ }
    let c =  { (x:Int, y:Int) -> Void in /* ... */ }
    
    f(1, 2)
    c(1, 2)
    
    extension Foo {
        subscript(x:Int, y:Int) -> Void {
            get { /* ... */ }
        }
    }
    
    foo[1, 2]
    
  • 初始化者

    “自动外部参数名称”是每个参数的默认值

    class Foo {
        init(x:Int, y:Int) { /* ... */ }
    }
    
    let foo = Foo(x: 1, y: 2)
    
  • 方法

    “自动外部参数名称”,第一个参数除外

    extension Foo {
        func bar(x:Int, y:Int) { /* ... */ }
    }
    
    foo.bar(1, y:2)
    
  • 下标→ 文件丢失

    不执行“自动外部参数名称”

    func f(x:Int, y:Int) { /* ... */ }
    let c =  { (x:Int, y:Int) -> Void in /* ... */ }
    
    f(1, 2)
    c(1, 2)
    
    extension Foo {
        subscript(x:Int, y:Int) -> Void {
            get { /* ... */ }
        }
    }
    
    foo[1, 2]
    
  • 还有一个特殊的规则

    • 默认值

      func fz(x:Int, y:Int, z:Int = 1) { /* ... */ }
      
      fz(1, 1, z: 1)
      
    当然,您可以使用以下方法覆盖这些默认行为:

    • 名称:键入
      :禁用“自动外部参数名称”
    • #名称:键入
      :强制“自动外部参数名称”
    • 外部名称内部名称:类型
      :显式外部名称

    您提到的文档是针对方法的,而不是针对函数的。有关函数,请参见:嘿,非常酷。现在这是有道理的。非常感谢。(你应该回答这个问题)你提到的文档是针对方法的,不是针对函数的。有关函数,请参见:嘿,非常酷。现在这是有道理的。非常感谢。(你应该这样回答)