是始终需要Swift 4自定义参数标签还是只是为了消除功能歧义?

时间:2018-11-11 21:40:00

标签: swift function arguments label

这个问题类似于 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()

1 个答案:

答案 0 :(得分:2)

如果您同时拥有两个someParam函数(每个函数都有一个不同命名的参数),则该行:

let funny = someParam

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

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

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

直接调用函数时,必须提供完整的函数名称,其中包括任何命名的参数标签。

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