我正在尝试编写一些辅助函数,并且正在获得某些类似方法的“无效重新声明”错误。如果有人能解释为什么这些方法发生冲突,我会非常感激。
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部分我找不到答案。任何输入都非常感谢。
答案 0 :(得分:6)
"自动外部参数名称的规则"功能与方法不同。
Swift应用不同的规则取决于可调用的类型。
功能/闭包→document
否"自动外部参数名称"执行。
func f(x:Int, y:Int) { /* ... */ }
let c = { (x:Int, y:Int) -> Void in /* ... */ }
f(1, 2)
c(1, 2)
初始值设定项→document
"自动外部参数名称"是每个参数的默认值。
class Foo {
init(x:Int, y:Int) { /* ... */ }
}
let foo = Foo(x: 1, y: 2)
方法→document
"自动外部参数名称"第一个参数的除外。
extension Foo {
func bar(x:Int, y:Int) { /* ... */ }
}
foo.bar(1, y: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)
当然,您可以使用以下方法覆盖这些默认行为:
_ 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)
}