函数中的参数标签

时间:2015-07-14 16:17:15

标签: ios swift

我正在学习 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

为什么第一个参数可能没有标签,而不是第二个参数?

2 个答案:

答案 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")

关于是否应将第二个参数分配给foodrestaurant,这将是不明确的。

答案 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")

取自Swift error: missing argument label 'name:' in call