我想了解Swift中的Optionals。代码有效,但我不明白为什么

时间:2019-03-22 21:33:24

标签: swift optional

我正在Excercism上从事一项任务,并且已经进行了一段时间的在线快速课程。我完成了一个任务,看到了这个解决方案(比我的代码少得多)。为什么这是可选的?

我不明白在X之前的函数开头下划线的目的,以及为什么删除它会破坏代码。我也很困惑为什么它只使用一个输入参数,即使函数中需要X和Y。此外,除非我添加标签,否则为X添加“ Alice”和为Y添加“ Steve”将不起作用,但对于没有标签的X则适用。

import UIKit

func TwoFer(_ X: String = "you ", Y: String = "one for me") -> String {
    return "one for \(X) " + "\(Y)"
}

TwoFer() // Prints one for you, one for me

TwoFer("Alice")  //Prints one for Alice, one for me

TwoFer("Alice", "Steve")  // ERROR: Missing argument label for Y:

预期结果是它不起作用,因为没有问号将X变为可选标记。

3 个答案:

答案 0 :(得分:4)

这个问题根本与Optionals(就Swift而言)无关。

  • 带有默认值的参数可以在函数调用中省略,无论是否必须指定参数标签。

  • 下划线表示在函数调用中省略(外部)参数标签。第一个标签被省略,第二个标签没有。

您必须写

TwoFer("Alice", Y:"Steve")

如果您也想省略第二个标签(不建议这样做),则必须声明该函数

func TwoFer(_ X: String = "you ", _ Y: String = "one for me") -> String

注意:

根据命名约定函数,变量和参数标签应以小写字母开头。

func twoFer(_ x: String = "you ", _ y: String = "one for me") -> String

答案 1 :(得分:1)

  • XY都有默认值,这就是为什么您可以不带参数调用该方法的原因。
  • 第一个参数的下划线_表示在外部调用时没有标签,但在内部称为XY在内部和外部都称为Y,这就是为什么需要明确提供它的原因。
TwoFer() // Uses the default values for X and Y
TwoFer("Alice") // "Alice" is X but does not require a label due to the underscore (`_`)
TwoFer("Alice", "Steve") // ERROR: Missing argument label for Y, as you pointed out
TwoFer("Alice", Y: "one for Steve") // "Alice" is X, "one for Steve" is Y

Swift Documentation对此有更多说明。

  

print(_:separator:terminator :)函数的第一个参数没有标签,其他参数是可选的,因为它们具有默认值。有关函数语法的这些变体,将在下面的“函数参数标签和参数名称以及默认参数值”中进行讨论。   https://docs.swift.org/swift-book/LanguageGuide/Functions.html

答案 2 :(得分:1)

只需开始即可-这段代码中没有可选。可选用?!表示。旁注-函数应遵循Camel Case以便在Swift中阅读。

下划线的目的

考虑您的功能:

func twoFer(_ x: String = "you ", y: String = "one for me") -> String {
    return "one for \(x) " + "\(y)"
}

这样称呼:

twoFer("Alice", y: "Steve")

下划线-就像Swift中的其他地方一样-忽略值,或者在这种情况下为参数标签。可以在Function Argument Labels and Parameter Names下找到有关您的问题的所有文档。

参数标签

或者,您的函数(秘密地)看起来像这样-注意双y:

func twoFer(_ x: String = "you ", y y: String = "one for me") -> String {
    return "one for \(x) " + "\(y)"
}

不需要显示y参数名称-可以将其简化为单个y,但是正如我所说,这就是它“秘密”的样子。 / em>

在这种情况下,您将按以下方式调用该函数:

twoFer("Alice", y: "Steve")

单个参数如何工作?

您创建了一个具有默认值的参数,该参数由=显示,例如x: String = "you "-如果没有默认值,则看起来像x: String值。默认值只是摆脱不必要的参数。

为什么y初始化后不起作用?

很简单,您只需为x设置参数名称。使用下划线将其设置为y

_ y: String = "one for me"