当我将firstThing
设置为默认值nil
时,这将起作用,没有nil
的默认值我得到一个错误,即调用函数时缺少参数。
通过输入Int?
,我认为它使用默认值nil
作为可选项,我是对的吗?如果是这样,为什么没有= nil
它不起作用?
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
选项和默认参数是两个不同的东西。
一个可选是一个变量,可以是nil
,就是这样。
省略该参数时,默认参数使用默认值,此默认值指定如下:func test(param: Int = 0)
如果指定一个可选参数,则必须提供该参数,即使您要传递的值是nil
。如果你的函数看起来像这个func test(param: Int?)
,你不能像这个test()
那样称它。即使参数是可选的,它也没有默认值。
您还可以将两者结合起来,并使用一个可选的参数,其中nil
是默认值,如下所示:func test(param: Int? = nil)
。
默认参数允许您在不传递参数的情况下调用函数。如果未传递参数,则提供默认参数。所以使用你的代码,这......
test()
......与此完全相同:
test(nil)
如果你省略这样的默认参数......
func test(firstThing: Int?) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
......那你就不能再这样了......
test()
如果这样做,您将收到您所描述的“缺失参数”错误。你必须每次都传递一个参数,即使那个参数只是nil
:
test(nil) // this works
Swift不像JavaScript这样的语言,你可以调用函数而不传递参数,它仍然会被调用。因此,要在Swift中调用函数,需要为其参数赋值。
参数的默认值允许您在调用函数时指定值而不指定它。这就是当你在test的声明中指定一个默认值时test()
工作的原因。
如果您不包含该默认值,则需要提供调用值:test(nil)
。
此外,并没有直接与这个问题相关,但可能值得注意,你使用“C ++”方式处理可能为空的指针,以处理Swift中可能的nil选项。以下代码更安全(特别是在多线程软件中),它允许您避免强制解包可选:
func test(firstThing: Int? = nil) {
if let firstThing = firstThing {
print(firstThing)
}
print("done")
}
test()
“可选参数”表示“此参数的类型是可选的”。它并不意味着“此参数是可选的,因此在调用函数时可以忽略”。
术语“可选参数”似乎令人困惑。为了澄清,说“可选类型参数”而不是“可选参数”更准确,因为这里的“可选”一词仅用于描述参数值的类型而不是其他内容。
您正在将Optional
与默认值混为一谈。 Optional
接受值或零。具有默认值允许在调用函数时省略参数。参数可以具有或不具有Optional
类型的默认值。
func someFunc(param1: String?,
param2: String = "default value",
param3: String? = "also has default value") {
print("param1 = \(param1)")
print("param2 = \(param2)")
print("param3 = \(param3)")
}
带输出的示例调用:
someFunc(param1: nil, param2: "specific value", param3: "also specific value")
param1 = nil
param2 = specific value
param3 = Optional("also specific value")
someFunc(param1: "has a value")
param1 = Optional("has a value")
param2 = default value
param3 = Optional("also has default value")
someFunc(param1: nil, param3: nil)
param1 = nil
param2 = default value
param3 = nil
总结一下:
Optional
可能是nil或者可能包含Type的实例Optional
和默认值都有,则可以从函数调用中省略,或者可以包含它,并且可以提供nil值(例如param1:nil)如果你需要使用bool param,你只需要分配默认值。
func test(WithFlag flag: Bool = false){.....}
然后你可以使用没有或与param一起使用:
test()
test(WithFlag: true)
如果你想能够在有或没有参数的情况下调用func
,你可以创建第二个同名的func
,它可以调用另一个。
func test(firstThing: Int?) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
func test() {
test(firstThing: nil)
}
现在你可以在没有参数的情况下调用名为test
的函数。
// both work
test()
test(firstThing: 5)
当您尝试组合该参数的可选参数和默认值时,这有点棘手。像这样,
func test(param: Int? = nil)
这两个是完全相反的想法。当你有一个可选的类型参数但你也提供了默认值时,它现在不再是一个可选类型,因为它有一个默认值。即使默认值为nil,swift也只是删除可选绑定而不检查默认值是什么。
所以最好不要使用nil作为默认值。