【问题标题】:Overloading a method with an optional parameter type in Swift在 Swift 中重载具有可选参数类型的方法
【发布时间】:2021-05-27 00:34:07
【问题描述】:

你能在下面的代码中解决这个Ambiguous use of 'y' 错误吗?

let x = 1

func y(_ x: Int) -> Int {
  return x
}

func y(_ x: Int?) -> Int? {
  return x
}

let z: Int? = y(x)
OptionalOverload.playground:5:6: note: found this candidate
func y(_ x: Int) -> Int {
     ^

OptionalOverload.playground:9:6: note: found this candidate
func y(_ x: Int?) -> Int? {
     ^

我只是希望编译器在这种情况下选择func y(_ x: Int) -> Int 方法,因为x 不是可选的。

【问题讨论】:

  • 我通过从函数签名之一“func y(x: Int) -> Int”中删除_来修复它,但实际上我也想知道详细原因。

标签: swift overriding optional


【解决方案1】:

这是因为编译器试图通过查看输入参数类型而不是带注释的返回类型来解决重载问题,对于输入参数类型,采用非可选参数的版本更具体,因此编译器是试图承受这种超载。

您可以通过将输入参数声明为 Optional 而不是将返回值注释为 Optional 来帮助编译器采用正确的重载版本。

let x: Int? = 1

func y(_ x: Int) -> Int {
  return x
}

func y(_ x: Int?) -> Int? {
  return x
}

let z = y(x)

【讨论】:

    【解决方案2】:

    看起来它可能取决于 Xcode 的版本,或者可能是项目的类型。我只是在 Xcode 12.1 的 Mac 命令行工具中尝试过,它没有抱怨。

    我在操场上也没有收到错误(Xcode 12.1 也是如此)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多