在Swift中,您可以编写以下内容:
func foo(_:Int) -> { return 1 }
下划线是被忽略的参数。我只是因为文档而知道这一点,但是不能想到为什么你甚至会这样做的任何用例。我错过了什么吗?
答案 0 :(得分:13)
忽略参数(或元组的成员,它们非常接近同一个东西)在以下情况下有意义:
您正在覆盖超类函数或实现协议定义的函数,但您对该函数的实现并不需要其中一个参数。例如,如果您挂起应用启动但不需要在该方法中引用共享的UIApplication
实例:
override func application(_: UIApplication!, didFinishLaunchingWithOptions _: NSDictionary!) -> Bool { /* ... */ }
您提供了一个闭包(在ObjC中也称为块)作为某个API的参数,但您对该API的使用并不关心闭包的其中一个参数。例如,如果您要对照片库提交更改并希望谨慎使用,则可以忽略完成处理程序中的success
和error
参数:
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
// change requests
}, completionHandler: { _, _ in
NSLog("Changes complete. Did they succeed? Who knows!")
})
您正在调用提供多个返回值的函数/方法,但不关心其中一个。例如,假设假设的NSColor
方法将组件作为元组返回,您可以忽略alpha:
let (r, g, b, _) = color.getComponents()
这背后的原因是它使您的代码更具可读性。如果您声明一个您最终未使用的参数(或元组成员)的本地名称,那么阅读您的代码的人(可能只是您自己几个月后的版本)可能会看到该名称并想知道它在函数体中的使用位置和方式。如果您事先声明忽略该参数(或元组成员),则表明在该范围内无需担心它。 (理论上,这也可以为编译器提供优化提示,这可能会使代码运行得更快。)
答案 1 :(得分:2)
也许你覆盖了一个方法而你的覆盖忽略了其中一个参数?明确表示你忽略了参数,这使得未来的编码人员不必查看你的代码就可以解决它没有使用参数的问题,并明确表示这是故意的。或者也许是创建某种适配器模式,您可以清楚地看到其中一个参数被忽略。