【问题标题】:Are Swift 4 custom argument labels ALWAYS required or just for disambiguation of functions?Swift 4 自定义参数标签是否总是需要或只是为了消除功能的歧义?
【发布时间】:2018-11-11 21:39:59
【问题描述】:

这个问题类似于 Swift 4 custom argument labels - required? 但更具体。在研究从 var(不需要参数)更改为 func(需要参数)但错过更改所有引用引起的问题时,我遇到了这个问题。我创建了一个游乐场,与随后对该问题的编辑中提出的声明相矛盾:“问题不正确,因为自定义标签是强制性的” 我的问题是:如何正确表达我观察到的,如下所示:

class SomeTest {
    static func someParam(p1: String?) -> String? {
        return "hello \(p1 ?? "nothing")"
    }

    // Uncommenting the following causes error at let funny
    //    static func someParam(p2: String?) -> String? {
    //        return "hello \(p2 ?? "nothing")"
    //    }

    static func doIt() {
        let funny = someParam // ignoring the argument label is ok if there is no ambiguity

        funny("thing") // and can be used without

        someParam(p1: "thing2") // must have argument label
    }
}

SomeTest.doIt()

【问题讨论】:

  • 您可以使用默认值someParam(p1: String? = nil),这将允许您在没有参数的情况下调用函数(并且该值将默认为nil)

标签: swift function arguments label


【解决方案1】:

如果你有两个someParam 函数(每个函数都有一个不同的命名参数),那么行:

let funny = someParam

不再有效,因为不知道您指的是两个 someParam 函数中的哪一个。这可以通过提供一个明确的名称来解决:

let funny = someParam(p1:) // or someParam(p2:)

请注意,funny 的类型为 (String?) -> String?。 someParam 两个函数都具有相同的类型。这就是为什么您需要提供更多细节来消除两者的歧义。参数名称不会改变函数类型。

当直接调用一个函数时,您必须提供包含任何命名参数标签的完整函数名。

但是当您创建一个闭包变量并为其分配一个函数的值时,如果该名称在给定上下文中是明确的,则您不需要提供比函数的基本名称更多的信息。

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多