【问题标题】:Swift and params method default valuesSwift 和 params 方法默认值
【发布时间】:2017-08-24 13:00:00
【问题描述】:

在我的A.swift 文件中

class A {
    func c(d: String = "abc") {
        // (1)
    }
}

在我的B.swift 文件中

class B {
   func z() {
      let aaa = A()
      aaa.c()
   }
}

extension A {
    func c(d: String = "abc", e: String = "123") {
        // (2)
    }
}

现在,我想知道:z() 被称为 (1) 还是 (2)?又是如何决定的?

【问题讨论】:

  • 你自己试过了吗?
  • 是的!它被称为 (1) 但我不明白为什么
  • 请参阅What is the difference between static func and class func in Swift? 及其其他答案。您要问的主要是静态与动态调度,您可以使用“静态调度 [swift]”搜索更多相关问题
  • @Honey 这个问题和dispatch无关,这是关于函数参数重载的问题
  • @taylorswift 你是对的。我就把它留在那里,所以你的评论不会毫无意义......

标签: swift overloading


【解决方案1】:

您的类A 有两个函数,c(d:)c(d:e:)。在 Swift 中,两个函数可以共享相同的“名字”,但可以通过它们的参数来区分。因此,函数的“全名”由其名称和所有参数标签组成。

换行

aaa.c()

aaa.c(d:e:)()

通过全名调用函数c(d:e:)(2)将执行。

注意aaa.c() 等同于aaa.c(d:)()。当调用不明确时,Swift 似乎默认使用参数最少的函数;这可能是未来Swift Evolution 提案的主题,如果还没有的话。

【讨论】:

  • 谢谢!我还认为当调用不明确时,Swift 会以最少的参数调用函数。你知道这是否记录在任何地方?
  • 哈哈!那么这是一个重载还是只是一个不同的功能或基本上重载转化为一个不同的功能? (我只是想让行话正确)
  • @Honey 从技术上讲,它是一个不同名称的不同函数,但对于来自函数名称是“括号前的东西”的语言的人来说,更容易将它们视为重载,尤其是当它涉及初始化程序。 Swift 的消歧语法有点糟糕,导致了混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多