disfavoredOverload - ShenYj/ShenYj.github.io GitHub Wiki

@_disfavoredOverload

func sameName() {
  ...
}

func sameName(parameter: Int) {
  ...
}
sameName() // no parameter => calls sameName()
sameName(parameter: 1) // parameter => calls sameName(parameter:)

以上示例代码中根据参数可以清晰的判断函数调用的预期行为

func sameName() {
  ...
}

func sameName(value: Int = 5) {
  ...
}

这段示例中,第一个函数没有参数,第二个函数有一个带有默认值的参数

sameName() // no parameter passed, both declarations match => ??

此时变回产生歧义

同时在函数重载时,也可能存在歧义

func sameName(_ number: Int) {
  ...
}

func sameName<N: Numeric>(_ number: N) {
  ...
}

以及以下情况

func sameName(_ number: Int) {
  ...
}

func sameName(_ numbers: Int...) {
  ...
}

Swift 通过 @_disfavoredOverload 这个attribute ,让我们在这种模棱两可的情况下来预测Swift的行为

属性前面的下划线意味着这个Swift功能还没有经过Swift Evolution。自行决定继续。

使用 @_disfavoredOverload属性,这将降低相关函数的排名,使不太具体的函数胜过更具体的函数。

@_disfavoredOverload 
func sameName() { ... }

func sameName(value: Int = 5) { ... }

使用此更新的声明,调用sameName()将匹配第二个函数。

⚠️ **GitHub.com Fallback** ⚠️