当我设置firstThing
为默认nil
值时,它将起作用,没有默认值nil
I时会出现错误,即调用该函数时缺少参数。
通过输入,Int?
我认为它使其具有默认值的可选,nil
对吗?如果是这样,为什么没有,它为什么不起作用= nil
?
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
当我设置firstThing
为默认nil
值时,它将起作用,没有默认值nil
I时会出现错误,即调用该函数时缺少参数。
通过输入,Int?
我认为它使其具有默认值的可选,nil
对吗?如果是这样,为什么没有,它为什么不起作用= nil
?
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
Answers:
可选参数和默认参数是两件事。
Optional是可以是的变量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(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)func getFilterNames(name: inout String){ }
,这将允许你修改中传递的名称。
如果您需要使用布尔参数,则只需分配默认值即可。
func test(WithFlag flag: Bool = false){.....}
那么您可以不带参数也可以带参数一起使用:
test() //here flag automatically has the default value: false
test(WithFlag: true) //here flag has the value: 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作为默认值。
nil
)的可选选项没有错。
var foo: String; print(foo)
)。但是具有默认值的函数参数是可选参数(您不必在函数调用中传递该参数),并且它也可以是可选类型(nil
甚至可以将其分配为默认值)。
默认值不表示数据类型的默认值。此处是定义函数时定义的默认值。我们必须在函数中定义变量时声明变量的默认值。
func test(firstThing: Int = 4)
:Optional
具有默认值的非参数。的Optional
类型(这是?
在一个类型名称膨胀至)是值类型; “可选参数”是在函数调用中可能出现或可能不出现的参数的不幸名称,无论其类型如何。