Swift 3.0
在 Swift 3.0 中(预计于2016年晚些时候发布),默认行为很简单:
您可以在Swift API 设计准则中最简洁地找到这些规则。这种最新行为是在SE-0056,“建立包括第一个标签在内的所有参数的一致标签行为”中提出的,并在SR-961中实现。如下所述,可以更改默认行为,即“覆盖默认行为。”
Swift 2.2
在 Swift 2.2 中,语言对外部参数标签的默认存在已更改,现在更加简单。默认行为可以总结如下:
- 方法和函数的第一个参数不应该有外部参数标签。
- 方法和函数的其他参数应该有外部参数标签。
- 初始化器的所有参数都应该有外部参数标签。
默认行为可以根据下面的"覆盖默认行为"进行更改。
示例
这些规则最好通过一个示例来说明:
func printAnimal(animal: String, legCount: Int) {
let legNoun = legCount == 1 ? "leg" : "legs"
print("\(animal) has \(legCount) \(legNoun)")
}
struct Player {
let name: String
let lives: Int
init(name: String, lives: Int) {
self.name = name
self.lives = lives
}
func printCurrentScore(currentScore: Int, highScore: Int) {
print("\(name)'s score is \(currentScore). Their high score is \(highScore)")
}
}
printAnimal(animal: "Dog", legCount: 4)
let p = Player(name: "Riley", lives: 3)
p.printCurrentScore(currentScore: 50, highScore: 110)
printAnimal("Dog", legCount: 4)
let p = Player(name: "Riley", lives: 3)
p.printCurrentScore(50, highScore: 110)
printAnimal(animal: "Dog", legCount: 4)
let q = Player("Riley", lives: 3)
p.printCurrentScore(50, 110)
覆盖默认行为
对于任何方法或函数的任何参数,您都可以偏离语言的默认设置,尽管样式指南正确地警告您不要这样做,除非有充分的理由。
要在通常没有外部参数标签的位置添加外部参数标签 - 仅适用于Swift 2.2,因为Swift 3.0将默认为将外部标签分配给每个参数 - 或更改外部参数标签 - 适用于两个版本 - 在本地参数标签之前编写所需的外部参数标签:
func printAnimal(theAnimal animal: String, legCount: Int) {
let legNoun = legCount == 1 ? "leg" : "legs"
print("\(animal) has \(legCount) \(legNoun)")
}
printAnimal(theAnimal: "Dog", legCount: 4)
如果通常情况下需要外部参数标签但你想要去掉它,可以使用特殊的外部参数标签 _
:
func printAnimal(animal: String, _ legCount: Int) {
let legNoun = legCount == 1 ? "leg" : "legs"
print("\(animal) has \(legCount) \(legNoun)")
}
printAnimal(theAnimal: "Dog", 4)
printAnimal("Dog", 4)
这些“默认覆盖”适用于任何方法或函数,包括初始化器。
ascending
,以便调用站点更加明确。因此,我按照这个答案的指示,将方法签名设置为sortByDate(ascending ascending: Bool)
。Xcode建议我可以通过将ascending ascending
更改为#ascending
来简化此过程,我已经这样做了。我认为我们可以说Swift显然是一种“现代编程语言”,因为它采用了井号(对我来说一直都是“井号”)。现在我想在我的代码中添加一个#stfu
参数。;-) - mharper#
强制使用第一个参数标签,例如:func myFunc( #parameter: String) {}
,这样就必须像这样调用它:myFunc(parameter:"")
,myFunc("")
会显示错误,就像 @Robert 在他的回答中所示。 - SirRupertIIIfunc myFunc(parameter parameter: String) {}
。 - Mark Mckelvie+
,而在 Swift 中则使用static
。在 ObjC 中,您必须手动进行延迟实例化,在 Swift 中只需使用lazy
关键字即可,在 ObjC 中,您必须使用(NSMutableArray*)
进行强制转换,在 Swift 中则使用关键字as
,这使得所有内容都更易读。 - mfaani