Swift中函数的无效重新声明

时间:2014-11-14 05:50:32

标签: 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) -> 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)
}

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

我一直在使用Apple的文档作为参考,但在Local and External Parameter Names for Methods部分我找不到答案。任何输入都非常感谢。

2 个答案:

答案 0 :(得分:6)

"自动外部参数名称的规则"功能与方法不同。

Swift应用不同的规则取决于可调用的类型。

  1. 功能/闭包document

    否"自动外部参数名称"执行。

    func f(x:Int, y:Int) { /* ... */ }
    let c =  { (x:Int, y:Int) -> Void in /* ... */ }
    
    f(1, 2)
    c(1, 2)
    
  2. 初始值设定项document

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

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

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

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

    否"自动外部参数名称"执行。

    extension Foo {
        subscript(x:Int, y:Int) -> Void {
            get { /* ... */ }
        }
    }
    
    foo[1, 2]
    
  5. 和......的特殊规则。

    • 默认值

      func fz(x:Int, y:Int, z:Int = 1) { /* ... */ }
      
      fz(1, 1, z: 1)
      

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

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

答案 1 :(得分:0)

这实际上看起来像文档中的错误。在我最初链接的部分Local and External Parameter Names for Methods中,写下了以下说明。

  

此默认行为有效地将方法视为在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)
}