为什么我需要在 swift 中使用下划线?

2024-01-20

Here https://www.weheartswift.com/tuples-enums/它说:“注意:_意思是“我不关心那个值”,但是来自 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: 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") }
    })

同样,当声明采用协议或重写超类方法的函数时,可以使用_对于参数names忽略参数。由于协议/超类也可能定义参数没有标签,因此您甚至可以连续使用两个下划线。

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 语句中绑定元组大小写,则下划线可以用作通配符,如下例所示(在Swift 编程语言 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ControlFlow.html#//apple_ref/doc/uid/TP40014097-CH9-ID120):

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")
}

最后一件事不太相关,但我将包括在内,因为(如评论所述)它似乎引导人们来到这里:下划线in标识符——例如var _foo, func do_the_thing(), struct Stuff_— 对于 Swift 来说没有什么特别的意义,但在程序员中有一些用途。

名称中的下划线是一种样式选择,但在 Swift 社区中并不受欢迎,该社区对于使用 UpperCamelCase 表示类型和 lowerCamelCase 表示所有其他符号有严格的约定。

使用下划线作为符号名称的前缀或后缀是一种样式约定,历史上用于区分私有/仅供内部使用的符号与导出的 API。然而,Swift 对此有访问修饰符,因此这种约定在 Swift 中通常被视为不惯用。

一些带有双下划线前缀的符号(func __foo())潜伏在 Apple SDK 的深处:这些是使用 (Obj)C 符号导入到 Swift 中的NS_REFINED_FOR_SWIFT属性。当 Apple 想要制作 (Obj)C API 的“更 Swifty”版本时,他们会使用它——例如,将与类型无关的方法变成泛型方法 https://github.com/apple/swift/blob/master/stdlib/public/SDK/Photos/PHChange.swift。他们需要使用导入的 API 来使精炼的 Swift 版本正常工作,因此他们使用__使其保持可用,同时对大多数工具和文档隐藏它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我需要在 swift 中使用下划线? 的相关文章

随机推荐

  • 我应该如何修改我的 Queue 类以允许用户在 F# 中创建未指定类型的空队列?

    我创建了一个不可变的Queue在F 中如下 type Queue lt a gt f a list r a list let check function r gt Queue List rev r f r gt Queue f r mem
  • 如何正确绘制变量

    我尝试查看文档 但没有找到我需要的答案 所以我在这里问 例如 我有 15 只海龟 这个数字可能会有所不同 我需要将它们的变量 例如收入 绘制到一个图中 我知道我可以通过命令绘制 1 个代理的变量 plot revenue of turtle
  • 用 for 循环替换 if 语句 (Java)

    我正在开发一个项目 收到的评论之一是我的 if 语句太长 我同意这一点 但我仍然很困惑如何用建议的 for 循环替换它 它一直让我发疯 该项目是分析句子中的辅音并报告它们是否在其中 这是我使用的代码 该项目已经被标记 所以这更像是一个 我的
  • 序列化类时出现 Stackoverflow 异常

    我有一棵树 想将它们序列化为 xml 这些节点派生自 Nodebase 类 我认为是在此处找到的 该类在序列化时失败 public class NodeBase IEqualityComparer IEnumerable IEnumerab
  • Python/AWS Lambda 函数:如何查看 /tmp 存储?

    Lambda 函数可以访问自己的磁盘空间 tmp目录 我的问题是 我在哪里可以直观地看到 tmp目录 我正在尝试将文件下载到 tmp目录来读取它们 并向其中写入一个新文件 我实际上希望看到我正在处理的文件是否正确存储在 tmp执行期间 谢谢
  • 目前 WPF 最好的空闲时间选择器是什么?

    我正在寻找一个简单的时间选择器WPF 的控件 我找到了这个 http marlongrech wordpress com 2007 11 18 time picker http marlongrech wordpress com 2007
  • Laravel 社交名流的名字和姓氏

    我正在使用 Laravel 的 Socialite 将社交身份验证添加到应用程序中 我可以检索全名 但不能分别检索名字和姓氏 回调发生且社交名流处理后 用户已成功检索 如果我要转储我从中恢复的用户 user this gt social g
  • 为arm64构建OpenSSL FIPS

    我找到了为arm64构建非FIPS openssl的参考 但我需要构建FIPS版本 项目如https github com GotoHack iOS openSSL FIPS https github com GotoHack iOS op
  • 运算符不存在:json = json

    当我尝试从表中选择一些记录时 SELECT FROM movie test WHERE tags dramatic women political json sql代码抛出错误 LINE 1 SELECT FROM movie test W
  • 通过注释抑制 IntelliJ IDEA 中的重复警告

    从版本 15 开始 IntelliJ 警告我有关代码重复的问题 https www jetbrains com help idea 2016 1 analyzing duplicates html origin old help 在某些情况
  • 如何在android中点击按钮打开下面的自定义布局对话框?

    我想在点击按钮下方创建下拉自定义对话框 单击计数器按钮 布局将显示在按钮下方 我看到了很多链接 但他们只打开列表 操作栏下拉打开和关闭项目样式 https stackoverflow com questions 15824793 actio
  • 如何在 Python 中创建通用接口?

    我想在 Python 中创建与此等效的内容 static class Event static class MyEvent extends Event interface Filter
  • React / Redux:mapStateToProps 实际上并未将状态映射到 props

    我在一个项目中使用 React 和 Redux 但在实现启用 禁用按钮的功能时遇到问题 我已经能够 触发一个方法 让该方法触发动作创建者 调度一个动作 在减速器中捕获该操作并创建一个新的更新状态 在 Redux DevTools 中查看更新
  • 在 for 循环中引用/取消引用向量元素

    在下面的代码中 我想保留number list 迭代之后 因为 into iter that for默认使用会消耗 因此 我假设n i32我可以获得的值n通过解除引用 fn main let number list vec 24 34 10
  • 如何在JTable中添加JCheckBox?

    首先 我为我的英语疏忽表示歉意 我将解释我所有的问题 首先我想在我拥有的 JTable 中使用 JCheckBox 我正在从数据库的列索引 0 和 1 中检索学生 ID 和学生姓名 我希望第三列应该是缺席 在场 最初将通过 JCheckbo
  • TinyMCE - 附加到通过 AJAX 调用加载的 div

    我知道以前有人问过这个问题 但我正在尝试通过 jQuery AJAX 加载一些附加到 tinymce 实例的 div 在AJAX加载的页面中 有几个tinymce div 它们是由PHP循环创建的 div p Some text p div
  • 无法在 C# 中使用 Sendkeys 发送下划线?

    我很无聊 所以我尝试编写一个程序 在按 ctrl shift L 时写出不赞成的笑脸 脸 现在一切正常 除了笑脸中的下划线 它根本不会被写出来 这是我首先使用的 SendKeys Send 我尝试过各种方法 比如在下划线周围添加 括号 当然
  • R/Igraph 在边列表中显示边权重?

    当将图形对象作为边列表查看时 有什么方法可以显示边权重吗 我想本着以下精神做一些事情 get edgelist graph attr weight 以便查看与节点旁边列出的权重的边缘配对 但这似乎是不允许的 我知道如何查看权重的唯一方法是将
  • iPhone:当其他视图存在ViewController时如何防止关闭键盘

    我的 iPhone 应用程序出现问题 有一个 2UIViewController First UIViewController with UITextField和键盘向上 一旦我将打开其他UIViewController有了presentV
  • 为什么我需要在 swift 中使用下划线?

    Here https www weheartswift com tuples enums 它说 注意 意思是 我不关心那个值 但是来自 JavaScript 我不明白这意味着什么 我可以打印这些函数的唯一方法是在参数之前使用下划线 func