我正在学习 swift ,在Apple的教程中,它在介绍function
时有以下代码段:
func greet(name: String, lunch: String) -> String {
return "Hello \(name), eat \(lunch)."
}
//Why here 'lunch' cannot be removed?
greet("Bob", lunch: "Tuesday")
代码定义了greet(String, String)
函数,但是当它调用函数时:
greet("Bob", lunch: "Tuesday")
第一个参数没有标签'name',但是第二个参数标有'lunch',如果我删除标签'lunch',编译错误会在调用中显示“缺少参数标签lunch
“
为什么第一个参数可能没有标签,而不是第二个参数?
答案 0 :(得分:1)
主要原因是清晰度。
在Swift的函数命名风格中,方法名称通常暗示第一个参数,但不是后来的参数。
例如:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "doSomething", name: UIScreenBrightnessDidChangeNotification, object: nil)
语法暗示 self
是您要添加到通知中心的观察者。
greet("Bob", "Tuesday")
意味着鲍勃正在受到欢迎,但并没有告诉你星期二与事情有什么关系。这使得代码的可读性降低,因此不允许使用。
第二个原因是默认参数值。请考虑使用此功能:
func greetForLunch(name: String, food: String = "pasta", restaurant: String = "Olive Garden") -> String {
return "Hello \(name). Would you like to eat \(food) at \(restaurant)?"
}
由于后两个参数具有默认值,因此可以省略其中一个或两个,例如:
greetForLunch("Bob", food: "endless breadsticks")
// "Hello Bob. Would you like to eat endless breadsticks at Olive Garden?"
但如果您未在此处指定food
,请执行以下操作:
greetForLunch("Bob", "endless breadsticks")
关于是否应将第二个参数分配给food
或restaurant
,这将是不明确的。
答案 1 :(得分:0)
Swift函数可以指定本地和外部参数名称:
func greet(who name: String = "world") {
println("hello \(name)")
}
// prints "hello world"
greet()
// prints "hello jeff"
greet(who:"jeff")
// error
greet("jeff")
// error
greet(name: "jeff")
要退出此行为,您可以使用下划线作为外部名称。请注意,第一个参数隐式使用"无外部名称"行为:
func greet(name: String = "world", _ hello: String = "hello") {
println("\(hello) \(name)")
}
// prints "hello world"
greet()
// prints "hello jeff"
greet("jeff")
// prints "hi jeff"
greet("jeff", "hi")
// error
greet(name: "jeff")
您可以使用#前缀为第一个参数使用相同的本地和外部名称:
func greet(#name: String = "world", hello: String = "hello") {
println("\(hello) \(name)")
}
// prints "hi jeff"
greet(name: "jeff", hello: "hi")