这里它说,“注意:_意思是‘你不关心那个值’”,但是来自 JavaScript,我不明白这是什么意思。
_
我可以打印这些函数的唯一方法是在参数前使用下划线:
func divmod(_ a: Int, _ b:Int) -> (Int, Int) { return (a / b, a % b) } print(divmod(7, 3)) print(divmod(5, 2)) print(divmod(12,4))
如果没有下划线,我必须这样写以避免任何错误:
func divmod(a: Int, b:Int) -> (Int, Int) { return (a / b, a % b) } print(divmod(a: 7, b: 3)) print(divmod(a: 5, b: 2)) print(divmod(a: 12,b: 4))
我不明白这个下划线的用法。我何时、如何以及为什么使用这些下划线?
不同的用例有一些细微差别,但通常下划线表示“忽略这个”。
当声明一个新函数时,下划线告诉 Swift 调用时参数不应该有标签——这就是你所看到的情况。更完整的函数声明如下所示:
func myFunc(label name: Int) // call it like myFunc(label: 3)
“label”是一个参数标签,在调用函数时必须存在。(从 Swift 3 开始,默认情况下所有参数都需要标签。)“name”是您在函数中使用的那个参数的变量名。更短的形式如下所示:
func myFunc(name: Int) // call it like myFunc(name: 3)
这是一个快捷方式,可让您对外部参数标签和内部参数名称使用相同的词。它相当于func myFunc(name name: Int).
func myFunc(name name: Int)
如果您希望您的函数在没有参数标签的情况下可调用,则使用下划线_使标签变为空/忽略。(在这种情况下,如果您希望能够使用该参数,则必须提供一个内部名称。)
func myFunc(_ name: Int) // call it like myFunc(3)
在赋值语句中,下划线的意思是“不要赋值给任何东西”。如果你想调用一个返回结果但不关心返回值的函数,你可以使用它。
_ = someFunction()
或者,就像您链接到的文章中一样,忽略返回元组的一个元素:
let (x, _) = someFunctionThatReturnsXandY()
当您编写实现某些已定义函数类型的闭包时,您可以使用下划线忽略某些参数。
PHPhotoLibrary.performChanges( { /* some changes */ }, completionHandler: { success, _ in // don't care about error if success { print("yay") } })
类似地,当声明一个采用协议或重写超类方法的函数时,您可以使用_参数 名称 来忽略参数。由于协议/超类也可能定义参数没有标签,因此您甚至可以以连续两个下划线结束。
class MyView: NSView { override func mouseDown(with _: NSEvent) { // don't care about event, do same thing for every mouse down } override func draw(_ _: NSRect) { // don't care about dirty rect, always redraw the whole view } }
与最后两种样式有些相关:当使用绑定局部变量/常量的流控制构造时,您可以使用_它来忽略它。例如,如果你想迭代一个序列而不需要访问它的成员:
for _ in 1...20 { // or 0..<20 // do something 20 times }
如果您在 switch 语句中绑定元组大小写,则下划线可以用作通配符,如下例所示(从 The Swift Programming Language 中的一个缩短):
switch somePoint { // somePoint is an (Int, Int) tuple case (0, 0): print("(0, 0) is at the origin") case (_, 0): print("(\(somePoint.0), 0) is on the x-axis") case (0, _): print("(0, \(somePoint.1)) is on the y-axis") default: print("(\(somePoint.0), \(somePoint.1)) isn't on an axis") }
最后一件事不太相关,但我将包括在内,因为(正如评论所指出的那样)它似乎将人们带到这里:标识符 中var _foo的下划线“例如,, func do_the_thing()”struct Stuff_对 Swift 没有什么特别的意义,但有一个在程序员中很少使用。
var _foo
func do_the_thing()
struct Stuff_
名称中的下划线是一种样式选择,但在 Swift 社区中不是首选,它对使用 UpperCamelCase 表示类型和使用 lowerCamelCase 表示所有其他符号有很强的约定。
使用下划线为符号名称添加前缀或后缀是一种样式约定,历史上用于区分私有/仅供内部使用的符号与导出的 API。但是,Swift 对此有访问修饰符,因此这种约定在 Swift 中通常被视为非惯用的。
一些带有双下划线前缀 ( ) 的符号潜伏在 Apple SDK 的深处:这些是使用该属性func __foo()导入 Swift 的 (Obj)C 符号。NS_REFINED_FOR_SWIFTApple 在他们想要制作 (Obj)C API 的“更 Swifty”版本时使用它——例如,将与类型无关的方法变成泛型方法。他们需要使用导入的 API 来使精炼的 Swift 版本工作,因此他们使用__保持它可用,同时将其隐藏在大多数工具和文档中。
func __foo()
NS_REFINED_FOR_SWIFT
__