是否总是需要Swift 4自定义参数标签,还是只是为了消除函数的歧义?

是否总是需要Swift 4自定义参数标签,还是只是为了消除函数的歧义?,swift,function,arguments,label,Swift,Function,Arguments,Label,这个问题类似于 但更具体。我在研究从var(不需要参数)更改为func(需要参数)但没有更改所有引用所导致的问题时遇到了这个问题。我创建了一个游乐场,它与该问题后续编辑中的声明相矛盾:“问题不正确,因为自定义标签是强制性的” 我的问题是:如何正确表达我的观察结果,如下所示: class SomeTest { static func someParam(p1: String?) -> String? { return "hello \(p1 ?? "nothing")

这个问题类似于 但更具体。我在研究从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
函数(每个函数都有一个不同的命名参数),则行:

let funny = someParam
不再工作,因为不知道您所引用的两个
someParam
函数中的哪一个。这可以通过提供一个明确的名称来解决:

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

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


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

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