【问题标题】:Missing declaration with default argument缺少带有默认参数的声明
【发布时间】:2018-10-11 08:39:14
【问题描述】:

此代码是否错误,或者这是一个已知问题?

final class Foo {
    //@inlinable @inline(_always)
    static func bar(_ first: String = "default", _ second: Int) {
        print(first,second)
    }
}

Foo.bar(2)

结果:

【问题讨论】:

  • 这对我来说似乎是一个错误。如果将参数标签添加到static func bar(_ first: String = "default",second: Int)static func bar(first: String = "default",_ second: Int) 等两个参数中的任何一个,它就可以正常编译。但是,编译器应该仍然能够推断出您要调用没有参数标签的默认参数,因为输入参数具有不同的类型。顺便说一句,Swift 的命名约定是类型的 UpperCamelCase,因此该类应称为 Foo
  • 解决方法?我不认为有一个......它是一个错误......提供两个参数
  • 是的,您的问题没有任何问题,它也可以帮助遇到同样问题的其他人。
  • 您可以尝试在forums.swift.org/c/swift-users上提问,也许这是一个已知问题。
  • @DávidPásztor 我的意思是:使用这种声明func test (_ first: String = "world", _ second: String = "!") { print(first, second) },您不能传递单个参数,并期望它转到second。对于没有外部标签的多个连续参数,必须先将值提供给第一个参数,然后再提供后面的参数。

标签: swift default-arguments


【解决方案1】:

我并不像某些 cmets 那样感到惊讶。必须始终按顺序提供参数。在完全没有标签的情况下,唯一有效的方法是提供第一个参数或同时提供两者。因此,提供单个参数意味着您需要提供一个字符串。默认值不会更改任何内容。

错误消息像往常一样没有帮助,其他语言的行为可能有所不同,但这并不构成错误。如果有什么可抱怨的,那就是编译器应该警告原始方法声明,因为第一个参数的默认值是 otiose。

【讨论】:

  • 作为一个新手,对于这样的问题你有什么建议?
  • 完全没有标签”不是多个连续参数没有标签的特殊情况吗?
  • 是的,这不是错误——as Joe Groff says,在进行类型检查之前,参数与参数对齐。
【解决方案2】:

我不会说这是一个错误,更可能是一个功能。这段代码闻起来很糟糕的代码风格......

  • 您没有指定可能导致非常糟糕的事情的参数名称并将Int 分配给String...我不会感到惊讶

现在我不想“教育”你如何编写漂亮的代码,但你上面发布的示例确实不是。编写没有标签的函数不是很直观,这就是为什么我们应该使用标签的完美示例......按照 Swift 社区的建议编写函数非常棒......

    final class Foo {
    //@inlinable @inline(_always)
    static func bar(first: String = "default", second: Int) {
        print(first,second)
    }
}

Foo.bar(second: 2)

为什么不直接省略下划线? :)

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多