我见过这样的代码:
func hello(name: String, #helloMessage: String) -> String {
return "\(helloMessage), \(name)."
}
我的问题是#
标记在参数名称之前的含义是什么?这是否意味着在调用函数时必须指定参数?
此外,任何人都可以告诉我没有此#
标记的功能吗?代码示例非常受欢迎。
答案 0 :(得分:40)
更新(Swift 3。* ...)
第一个参数签名的默认行为发生了巨大变化。要了解参数标签(例如“外部参数”)和参数名称(例如“本地参数”)如何工作,请阅读Apple的Swift-book中的“函数参数标签和参数名称”一章。
一些例子:
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.“The Swift Programming Language。”iBooks。 https://itunes.apple.com/ru/book/swift-programming-language/id881256329?l=en&mt=11
答案 1 :(得分:5)
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")
答案 2 :(得分:1)
**
**
如果要为函数参数提供外部参数名称,并且本地参数名称已经是要使用的适当名称,则不需要为该参数两次写入相同的名称。相反,写一次名称,并在名称前加上一个井号(#)。这告诉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.“The Swift Programming Language。”iBooks。
答案 3 :(得分:0)
以前版本的Swift @ovejka发布的所有内容都是真的。在Swift 2.0及更高版本中,看起来class ArtistsController < ApplicationController
def index
request = search_params[:query]
unless request.nil?
response = HTTParty.get("https://api.spotify.com/v1/search?q="+request+"&type=artist")
@hash_version = JSON.parse(response.body)
end
end
private
def search_params
params.permit(:query, :utf8, :commit)
end
end
未使用(在此或类似的上下文中,不计算#
)
答案 4 :(得分:-1)
我同意。这很令人困惑,但我希望这有助于澄清它。
如果您不使用#
,则可以输入参数而不使用其名称,只要它们按顺序排列:
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)
。
为什么会这样?明晰。使代码更具可读性。