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