【问题标题】:What is the meaning of the '#' mark in swift languageswift语言中的'#'标记是什么意思
【发布时间】:2017-10-17 22:23:30
【问题描述】:

我见过这样的代码:

func hello(name: String, #helloMessage: String) -> String { 
    return "\(helloMessage), \(name)." 
} 

我的问题是参数名称前的# 标记是什么意思?是不是说调用函数时必须指定参数?

此外,任何人都可以告诉我没有这个# 标记的功能的区别吗?代码示例非常受欢迎。

【问题讨论】:

  • 它也破坏了语法高亮(可能不仅在这里)
  • 这个是swift2改的,需要人解释一下
  • 在 Swift 2 中,第二个和后续参数的主题标签 (#) 隐含地告诉外部标签和本地名称,除非您使用下划线 (_) 抑制对外部标签的需要。

标签: swift


【解决方案1】:

更新(Swift 3.*...)

第一个参数签名的默认行为发生了巨大变化。要了解参数标签(例如“外部参数”)和参数名称(例如“本地参数”)的工作原理,请阅读 Apple Swift 手册中的“函数参数标签和参数名称”一章。

一些例子:

func someFunction(parameterName: Int) { parameterName }
someFunction(parameterName: 5) // argument label not specified

func someFunction(argumentLabel parameterName: Int) { parameterName }
someFunction(argumentLabel: 5) // argument label specified

func someFunction(_ parameterName: Int) { parameterName }
someFunction(5) // argument label omitted

方法和函数之间的这种行为没有区别。


更新 (Swift 2.*)

下面描述的功能已被弃用,需要将参数名称写入两次才能获得与之前使用哈希符号相同的行为。


更新(示例)

对于函数:当函数被调用并且某些参数的用途不明确时,您可以为这些参数提供外部名称。

func someFunction(parameterName: Int) { parameterName }
someFunction(5) // What is the meaning of "5"? 

func someFunction(externalParameterName parameterName: Int) { parameterName }
someFunction(externalParameterName: 5) // Now it's clear.

但如果外部名称和本地名称相同,则只需在参数名称前写一个井号即可。

func someFunction(#parameterName: Int) { parameterName }
// It's actually like:
// func someFunction(parameterName parameterName: Int) { parameterName }
someFunction(parameterName: 5)

对于方法:默认情况下,第一个参数名称仅是本地的(如函数),但第二个和后续参数名称都是本地和外部的(就像您在参数名称前写一个井号,这个 # 隐含在那里) :

class SomeClass {
    func someMethodWith(firstParameter: Int, andSecondParameter: Int) { ... }
}
SomeClass().someMethodWith(5, andSecondParameter: 10)

您也可以使用#(或添加显式外部名称)作为方法的第一个参数,但它与 Objective-C 风格的调用不匹配。

class SomeClass {
    func someMethodWith(#firstParameter: Int, andSecondParameter: Int) { ... }
}
SomeClass().someMethodWith(firstParameter: 5, andSecondParameter: 10)

原答案

如果您想为函数提供外部参数名称 参数,并且本地参数名称已经是适当的名称 要使用,您不需要为此写两次相同的名称 范围。取而代之的是,只写一次名称,并在名称前加上 井号 (#)。这告诉 Swift 使用该名称作为本地 参数名称和外部参数名称。

摘自:Apple Inc. “Swift 编程语言”。电子书。 https://itunes.apple.com/ru/book/swift-programming-language/id881256329?l=en&mt=11

【讨论】:

  • 对于方法,它会从第二个参数开始自动执行此操作。
  • 对于初始化器,# 隐含地存在于所有参数中。
  • 您能否给我展示不同的代码示例以突出使用和不使用“#”标记时的区别?
  • 这是否与#selector、#available 以及此符号的类似用途有关?
  • @SimplGy 没有。此功能(参数名称前的散列)不再是该语言的一部分(在 Swift 2.0 中已弃用)。
【解决方案2】:

这在 Swift 2 中有所改变:

现在您在内部参数之前指定一个外部参数名称,而不是使用# 来强制现有名称。


按照约定,方法名中包含动作动词,调用方法时不指定第一个参数:

func sayHiFrom(sender: String, to: String) {
    print("Hi from \(sender) to \(to)!")
}

sayHiFrom("Jules", to: "Jim")

指定内部参数名称

这一次,第二个参数在方法内部使用了不同的名称,而无需更改外部名称。当一个参数有两个名字时,第一个是外部的,第二个是内部的:

func sayHiFrom(sender: String, to receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHiFrom("Jane", to: "John")

强制使用外部参数名称

您可以强制第一个参数具有外部名称:

func sayHi(from sender: String, to receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHi(from: "Joe", to: "Jack")

在这种情况下,方法名最好不要包含操作项,因为强制参数名已经发挥了作用。

强制没有外部参数名称

您还可以通过在其他参数前面加上_(下划线)来删除参数名称:

func sayHi(sender: String, _ receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHi("Janice", "James")

【讨论】:

  • 正确,不错的更新,但看起来这个问题和答案 (@ovejka's) 将是历史问题,因为不再需要解释“#”的含义,因为它不用于现代迅速,但在过去,它完全符合@ovejka 发布的内容
  • @JulianKról 不完全是,我正在关注一个仍然使用 # 的教程。这个页面给了我为什么不被接受的答案。
【解决方案3】:

**

外部参数名称简写

**

如果您想为函数参数提供外部参数名称,并且本地参数名称已经是可以使用的适当名称,则无需为该参数编写两次相同的名称。相反,只写一次名称,并在名称前加上井号 (#)。这告诉 Swift 使用该名称作为本地参数名称和外部参数名称。

此示例定义了一个名为 containsCharacter 的函数,该函数通过在其本地参数名称之前放置一个井号来为其两个参数定义外部参数名称:

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
    for character in string {
        if character == characterToFind {
            return true
        }
    }
    return false
}

此函数对参数名称的选择使函数体清晰易读,同时也使函数可以毫无歧义地被调用:

let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")
// containsAVee equals true, because "aardvark" contains a "v”

摘自:Apple Inc.“Swift 编程语言”。电子书。

https://itun.es/in/jEUH0.l

【讨论】:

  • 您能否给我展示不同的代码示例以突出使用和不使用“#”标记时的区别?
【解决方案4】:

对于以前版本的 Swift,@ovejka 发布的所有内容都是真实的。在 Swift 2.0 及更高版本中,# 似乎未使用(在此或类似上下文中,不包括 #available)

【讨论】:

    【解决方案5】:

    我同意。这很令人困惑,但我希望这有助于澄清它。

    如果不使用#,可以不使用名称输入参数,只要按顺序即可:

    func x(a:Int, b:Int, c:Int) {some code}
    x(10,20,30) or x(a:10, b:20, c:30) //Still have to be in order!
    

    ...但是如果添加#,则不允许使用第一个变体,即x(10,20,30),因为 Swift 现在强制使用标签。你只能使用x(a:10, b:20, c:30)。

    为什么会这样?明晰。使代码更具可读性。

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2011-01-14
      • 2011-05-05
      • 2020-10-30
      相关资源
      最近更新 更多