我对Swift 3中的函数命名约定感到有点困惑
我浏览了Swift 3指南,发现方法命名约定应如下所示:
func move(from start: Point, to end: Point)
x.move(from: x, to: y)
如果我查看UINavigationController方法,我找到了pushViewController
和presentViewController
方法。方法调用如下所示:
navigationController?.pushViewController(viewController, animated: true)
navigationController?.present(controller, animated: true)
在这里,我想知道为什么pushViewController
方法调用不像Swift3那样。为什么这两种方法之间存在不一致。由于指导原则,我认为push
方法应如下所示:
rootNavigationController?.push(viewController, animated: true)
然后它会更像Swift 3。
//1
func saveName(_ name : String) {}
saveName("John")
//2
func save(_ name: String){}
save("John")
//3
func save(name: String){}
save(name: "John")
在我看来,我认为3号选项最适合Swift 3指南。
但另一方面,由于我使用pushViewController
和present(controller)
方法的示例,选项编号1也很好。
哪种选择最适合Swift 3指南?
由于@Sweeper的回答,它解决了push
和present
方法之间存在不一致的原因。
https://github.com/raywenderlich/swift-style-guide
https://swift.org/documentation/api-design-guidelines/#parameter-names
答案 0 :(得分:4)
请在此处查看:https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md
它说:
- 永远不要从匹配a的方法的基本名称修剪后缀 封闭类的财产:
这种启发式具有的效果 阻止我们为那些方法生成过于通用的名称 从概念上修改类的属性。
...如果我们放弃GestureRecognizer,只留下添加,我们结束了 使用概念上修改gestureRecognizers的方法 属性,但使用过于通用的名称:
这就是pushViewController
未重命名的原因。在UINavigationController
中,有一个名为viewControllers
的属性。避免使用“过于通用的名称”。
为什么present
重命名了?
请注意,present
中定义了UIViewController
。 UIViewController
没有名为viewController
或viewControllers
的属性,因此ViewController
部分会被删除。
答案 1 :(得分:2)
UIKit
和Foundation
框架都是Objective-C
构建的,并且在Swift
之前就已存在。 具有或不具有外部参数名称的功能是完全可以的。这取决于场景(类,函数和上下文)
目标是定义函数名称,使单独的函数名称(不带参数)描述函数将执行的操作。
从用法及其调用方式来看。明确的名称确实可以提高可读性并为良好的设计铺平道路(避免混淆函数属于类A
或类B
struct Record {
var name : String
var age : Int
func save() {}
}
在这种情况下,由于name
age
和Record
属性,因此根本没有任何参数可能是有意义的
因此类/ struct / enum也会添加上下文,因此可以避免不必要/冗余的单词。
带副作用的功能用动词
答案:
因此,它取决于上下文,并尝试查看API的用法,这将为您提供更多有关如何设计API的见解。
record.save()
注意:以上只是一个示例,可能在您的方案中save
函数可能是不同上下文的一部分。