Swift函数中的默认可选参数

问题描述 投票:69回答:8

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

通过输入Int?,我认为它使用默认值nil作为可选项,我是对的吗?如果是这样,为什么没有= nil它不起作用?

func test(firstThing: Int? = nil) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}
test()
swift function optional
8个回答
135
投票

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

一个可选是一个变量,可以是nil,就是这样。

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

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

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


17
投票

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

test()

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

test(nil)

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

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}

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

test()

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

test(nil)   // this works

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()

1
投票

“可选参数”表示“此参数的类型是可选的”。它并不意味着“此参数是可选的,因此在调用函数时可以忽略”。

术语“可选参数”似乎令人困惑。为了澄清,说“可选类型参数”而不是“可选参数”更准确,因为这里的“可选”一词仅用于描述参数值的类型而不是其他内容。


1
投票

您正在将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

总结一下:

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

0
投票

如果你需要使用bool param,你只需要分配默认值。

func test(WithFlag flag: Bool = false){.....}

然后你可以使用没有或与param一起使用:

test()
test(WithFlag: true)

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)

-1
投票

当您尝试组合该参数的可选参数和默认值时,这有点棘手。像这样,

func test(param: Int? = nil)

这两个是完全相反的想法。当你有一个可选的类型参数但你也提供了默认值时,它现在不再是一个可选类型,因为它有一个默认值。即使默认值为nil,swift也只是删除可选绑定而不检查默认值是什么。

所以最好不要使用nil作为默认值。

© www.soinside.com 2019 - 2024. All rights reserved.