我见过这样的代码:
func hello(name: String, #helloMessage: String) -> String {
return "\(helloMessage), \(name)."
}
我的问题是#
参数名称之前的标记是什么意思?这是否意味着在调用函数时必须指定参数?
此外,任何人都可以告诉我没有这个#
标记的功能吗?代码示例非常受欢迎.
更新(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
方法和函数之间的这种行为没有区别.
更新(斯威夫特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
这在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")