Swift函数

时间:2016-05-18 17:02:37

标签: swift function optional

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

输入Int?我认为它是可选的,默认值为nil,我是对的吗?如果是这样,为什么没有= nil

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

10 个答案:

答案 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

总结:

  • 输入带有? (例如String?)是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?)。因此,如果您希望调用方有机会忽略该参数,您必须为调用方完成这项工作并传递一个默认值

通常我们需要 .noneoptional 大小写,所以我们可以这样做:

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)

默认值不表示数据类型的默认值。此处是在定义函数时定义的默认值。 我们必须在函数中定义变量时声明变量的默认值。