Swift函数中的默认可选参数

Ric*_*edt 89 function optional swift

当我设置firstThing为默认值时,nil这将起作用,没有默认值nil我得到一个错误,即调用函数时有一个缺少的参数.

通过键入Int?我认为它使其成为可选的默认值nil,我是对的吗?如果是这样的话,为什么没有它= nil呢?

func test(firstThing: Int? = nil) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}
test()
Run Code Online (Sandbox Code Playgroud)

Emi*_*aez 161

选项和默认参数是两个不同的东西.

可选是一个变量nil,就是它.

省略该参数时,默认参数使用默认值,此默认值指定如下:func test(param: Int = 0)

如果指定一个可选参数,则必须提供该参数,即使您要传递的值也是如此nil.如果您的函数看起来像这样func test(param: Int?),则不能像这样调用它test().即使参数是可选的,它也没有默认值.

您还可以将两者结合起来并使用一个参数,该参数采用可选的where nil默认值,如下所示:func test(param: Int? = nil).

  • "如果指定一个可选参数,则必须提供它".太好了,谢谢斯威夫特 (18认同)
  • @andrewtweber您的幽默感受到赞赏,但是对于新手来说,我认为澄清“可选”是指提供一种对象或价值可能会有所帮助。您不必这样做,您可以提供nil(代表不存在对象或值)。您只需要决定选择哪个选项即可。 (7认同)

Aar*_*sen 19

默认参数允许您在不传递参数的情况下调用函数.如果未传递参数,则提供默认参数.所以使用你的代码,这......

test()
Run Code Online (Sandbox Code Playgroud)

......与此完全相同:

test(nil)
Run Code Online (Sandbox Code Playgroud)

如果你省略这样的默认参数......

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}
Run Code Online (Sandbox Code Playgroud)

......那你就不能再这样了......

test()
Run Code Online (Sandbox Code Playgroud)

如果这样做,您将收到您所描述的"缺失参数"错误.你必须每次都传递一个参数,即使那个参数只是nil:

test(nil)   // this works
Run Code Online (Sandbox Code Playgroud)


nbl*_*oqs 16

Swift不像JavaScript这样的语言,你可以调用函数而不传递参数,它仍然会被调用.因此,要在Swift中调用函数,需要为其参数赋值.

参数的默认值允许您在调用函数时指定值而不指定它.这就是test()在test的声明中指定默认值时的原因.

如果您不包含该默认值,则需要在呼叫中提供值:test(nil).

此外,并没有直接与这个问题相关,但可能值得注意,你使用"C++"方式处理可能为空的指针,以处理Swift中可能的nil选项.以下代码更安全(特别是在多线程软件中),它允许您避免强制解包可选:

func test(firstThing: Int? = nil) {
    if let firstThing = firstThing {
        print(firstThing)
    }
    print("done")
}
test()
Run Code Online (Sandbox Code Playgroud)


Nii*_*uda 6

如果您需要使用布尔参数,则只需分配默认值即可。

func test(WithFlag flag: Bool = false){.....}
Run Code Online (Sandbox Code Playgroud)

那么你可以不带或带参数使用:

test() //here flag automatically has the default value: false
test(WithFlag: true) //here flag has the value: true
Run Code Online (Sandbox Code Playgroud)

  • 对于对此投反对票的人,您可以改正错误的事情,这样其他人就会理解。 (2认同)

Chu*_*ger 5

您正在将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)")
}
Run Code Online (Sandbox Code Playgroud)

带输出的示例调用:

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
Run Code Online (Sandbox Code Playgroud)

总结一下:

  • 输入?(例如String?)是Optional可能为nil或可能包含Type的实例
  • 调用函数时可以省略带有默认值的参数,并使用默认值
  • 如果两者都Optional具有默认值,则可以将其从函数调用中省略,或者可以将其包括在内,并可以为其提供nil值(例如,param1:nil)