任何人都可以解释Swift语法吗?

时间:2015-11-10 18:46:22

标签: swift syntax swift2

任何人都可以向我解释这段Swift语法:

func someFunc(label label: String, image: UIImage){}

我想知道第一个label参数意味着什么?为什么不有类型?为什么没有逗号分隔符?

3 个答案:

答案 0 :(得分:3)

当你给变量赋予两个名字时,第一个名字由函数的调用者使用,第二个名字用于你的函数内。

请参阅this documentation,向下滚动至指定外部参数名称。这是该部分的一个例子。

这是sayHello(_ :)函数的一个版本,它使用两个人的名字并为它们返回一个问候语:

func sayHello(to person: String, and anotherPerson: String) -> String {
    return "Hello \(person) and \(anotherPerson)!"
}
print(sayHello(to: "Bill", and: "Ted"))
// prints "Hello Bill and Ted!"

通过为两个参数指定外部参数名称,在调用sayHello(to:和:)函数时,必须标记第一个和第二个参数。

使用外部参数名称可以允许以富有表现力的,类似于句子的方式调用函数,同时仍然提供可读且清晰的函数体。

答案 1 :(得分:3)

其他人已经回答了关于Swift 2中参数的外部名称语法的问题,所以我在此不再重复。

但我建议您在命名参数时考虑方法名称。假设您在单元格类中有一些更新标签和图像的方法。然后该方法可以定义为

update(label label: String, image: UIImage) { ... }

然后你将其称为

update(label: "foo", image: barImage)

但是在Swift 2中,通常建议将识别信息合并到方法名称本身中,例如

updateLabel(label: String, image: UIImage) { ... }

然后你将其称为

updateLabel("foo", image: barImage)

命名方法的关键观察是方法名称中的最后一个名词经常引用第一个参数(因此我们通常不为第一个参数提供外部参数名称)。但是如果方法名称中的最后一个名词没有引用第一个参数是什么,那么你可以为该参数提供一个外部名称。

值得注意的是,上面的讨论只适用于Swift 3之前的Swift版本,它们定义了参数的命名(例如,第一个参数的名称被合并到方法名称中,并且第一个参数的名称通常没有参数)反映当时在Cocoa中流行的Objective-C API。在Swift 3中,这个约定发生了变化。

在Swift 3中,他们明确建议方法名称​​不包含第一个参数的名称,因此您将上面的内容定义为:

func update(label: String, image: UIImage) { ... }

但是,当你调用这个Swift 3函数时,提供第一个参数的标签(即使原始声明中没有包含明确的外部标签):

update(label: "Foo", image: someImage)

如果您需要Swift 2模式来抑制第一个(或任何参数),在Swift 3中,您可以使用_执行此操作:

updateLabel(_ label: "Foo", image: someImage)

但是,虽然您可以抑制参数(在Swift 3中使用_),但通常不建议这样做,除非有其他令人信服的理由这样做。

答案 2 :(得分:2)

在swift中使用函数时,每个参数都有两个名称,一个是外部名称,一个是内部名称。虽然除了一个参数之外的所有参数都可以在第一个参数上同时具有内部和外部相同的名称,以便具有内部和外部名称,您需要将它指定两次,如:

func someFunc(label label: String)

外部名称始终为左侧,右侧为本地名称。如果您有多个参数,那么如果您希望内部具有不同的外部名称,则可以按如下方式指定它:

func someFunc(label label: String,externalName image: UIImage){}

在函数内部使用内部参数名称,调用函数后,外部名称将是正确的。这将是您致电someFunc时的结果:

someFunc(label: ..., externalName: )

您可以通过添加_而不是其名称来完全删除第二个参数中的名称。我建议你在这里好好看看,以便很好地掌握swift中的功能。 Functions in Swift