当我将firstThing
设置为默认nil
时,这将有效,没有默认值nil
我收到一个错误,即调用该函数时缺少参数。
输入Int?
我认为它是可选的,默认值为nil
,我是对的吗?如果是这样,为什么没有= nil
?
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
答案 0 :(得分:129)
选项和默认参数是两回事。
可选是一个可以是nil
的变量,就是它。
当您省略该参数时,默认参数使用默认值,此默认值指定如下:func test(param: Int = 0)
如果您指定一个可选参数,则必须提供该参数,即使您要传递的值为nil
。如果您的函数看起来像func test(param: Int?)
,则不能像test()
那样调用它。即使参数是可选的,它也没有默认值。
你也可以将两者合并,并有一个参数,该参数选择nil
是默认值,如下所示:func test(param: Int? = nil)
。
答案 1 :(得分:15)
默认参数允许您在不传递参数的情况下调用函数。如果您没有传递参数,则提供默认参数。所以使用你的代码,这...
test()
...与此完全相同:
test(nil)
如果省略这样的默认参数......
func test(firstThing: Int?) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
...然后你再也不能这样做了......
test()
如果你这样做,你将得到"缺少参数"你描述的错误。您必须每次都传递一个参数,即使该参数只是nil
:
test(nil) // this works
答案 2 :(得分:15)
Swift不像JavaScript这样的语言,你可以在不传递参数的情况下调用函数,它仍然会被调用。因此,要在Swift中调用函数,需要为其参数赋值。
参数的默认值允许您在调用函数时指定值而不指定它。这就是当你在test的声明中指定一个默认值时test()
有效的原因。
如果您不包含该默认值,则需要在通话中提供值:test(nil)
。
另外,并没有直接与这个问题相关,但可能值得注意的是,你正在使用“C ++”方式处理可能为空的指针,以处理Swift中可能的nil选项。以下代码更安全(特别是在多线程软件中),它允许您避免强制解包可选:
func test(firstThing: Int? = nil) {
if let firstThing = firstThing {
print(firstThing)
}
print("done")
}
test()
答案 3 :(得分:1)
"可选参数"表示"此参数的类型是可选的"。它并不意味着"此参数是可选的,因此,当您调用函数"时可以忽略它。
术语"可选参数"似乎令人困惑。为了澄清,说"可选类型参数"更准确。而不是"可选参数"作为单词"可选"这里仅用于描述参数值的类型而不是其他内容。
答案 4 :(得分:1)
您正在将Optional
与默认值进行混合。 Optional
接受一个值或nil。具有默认值允许在调用函数时省略参数。参数可以具有缺省值,而可以为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或可能包含的实例
输入Optional
和{default}都具有默认值,则可以从函数调用中将其省略,或者可以将其包含为nil值(例如,param1:nil)答案 5 :(得分:0)
如果您希望能够使用或不使用参数来调用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)
答案 6 :(得分:0)
Optional
是一个 enum
,它有两种情况:
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
/// The absence of a value.
///
/// In code, the absence of a value is typically written using the `nil`
/// literal rather than the explicit `.none` enumeration case.
case none
/// The presence of a value, stored as `Wrapped`.
case some(Wrapped)
}
Xcode 内 Optional 的原始编译源代码
当您定义接受一些 Type
参数的函数时,您可以传递具有相同类型的默认值。
firstThing
的类型是 Optional<Int>
(也称为 Int?
)。因此,如果您希望调用方有机会忽略该参数,您必须为调用方完成这项工作并传递一个默认值。
通常我们需要 .none
的 optional
大小写,所以我们可以这样做:
func test(firstThing: Optional<Int> = .none) { ... }
这与:
func test(firstThing: Int? = nil) { ... }
谁知道我们可选的默认值是 nil
?也许传递 nil
意味着该函数应该通过将其值更新为“nil”来删除某些内容。所以不要假设“可选的默认值是零”
答案 7 :(得分:-1)
当您尝试组合该参数的可选参数和默认值时,这有点棘手。像这样,
func test(param: Int? = nil)
这两个是完全相反的想法。当你有一个可选的类型参数但你也提供了默认值时,它现在不再是一个可选类型,因为它有一个默认值。即使默认值为nil,swift也只是删除可选绑定而不检查默认值是什么。
因此,最好不要将nil用作默认值。
答案 8 :(得分:-1)
如果需要使用布尔参数,只需分配默认值即可。
func test(WithFlag flag: Bool = false){.....}
然后您可以不带参数或带参数使用
:test()
test(WithFlag: true)
答案 9 :(得分:-1)
默认值不表示数据类型的默认值。此处是在定义函数时定义的默认值。 我们必须在函数中定义变量时声明变量的默认值。