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



这个问题类似于Swift 4自定义参数标签-必需?但更具体。我在研究一个由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:)

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

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

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

最新更新