我正在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变为可选标记。
答案 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)
X
和Y
都有默认值,这就是为什么您可以不带参数调用该方法的原因。_
表示在外部调用时没有标签,但在内部称为X
。 Y
在内部和外部都称为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"