本文翻译自:http://www.raywenderlich.com/90974/swift-style-guide-december-2014-update
翻译:星星上的猫
一、Optional Binding 可选类型绑定:
我们总结出两条关于命名的规范
1、不要给可选变量取optionalString,maybeView之类的名字;
2、不要给绑定变量取reallyLabel,unwappedView之类的名字。
对于optional类型的绑定,我们提出了一个简单的解决方案:影子命名法
var textLabel: UILabel?
// later...
if let textLabel = textLabel {
// do something with textLabel, which is now unwrapped
}
虽然 if let textLabel = textLabel 看起来有点奇怪,但我认为这种方式是解决命名麻烦的最佳方案:首先变量名简洁并且一目了然,其次,当有时候你把可选值和绑定值搞混的时候,编译器会给出提示。
二、Struct vs. Class 类与结构体
在Objective-C中,我们喜欢在所有地方都使用类,C-风格的结构体在有了ARC后变得很不常用,因为编译器帮我们考虑了什么时候该retain,什么时候该release。
Swift中的结构体给我们提供了另一种强大的功能选择,但我们有时仍热会困惑,到底什么时候该用类,什么时候该用结构体?当然,有一些人的建议是,在你不知道该用哪个的时候,就用结构体吧。
然而,实际情况并不总是那么简单。我们团队的精英Matthijs提出了一种非常不错的解决方案:利用对象的“特性”来决定如何选择结构体和类。
结构体是value semantics(值语义)。当你的对象不具有“特性”,就用结构体。
比如说一个包含了[a, b, c]的array与另一个同样包含了[a, b, c]的array是等价的,可以说是完全可以互换。你使用它们中任何一个都没有区别。因为它们两者都代表同一种东西,这也就是为什么array是一种结构体。
类是reference semantics(引用语义)。当你的对象确实具有某种“特性”,或者具有特有的生命周期的时候,就用类。
比如说你应该用类来建立一个person模型。因为两个person对象代表两个不同的人。就算两个人的名字和年龄都相同,也不意味着他们是同一个人。但是,这些人的生日就可以用结构体来表示,假设其中一个日期是1950年3月3日,另一个日期也是1950年3月3日,两个日期是等价的。日期本身并不包含“特性”。
三、Struct Initializers and Constants 结构体的初始化与结构体常量
与苹果一样,我们推荐在初始化的时候加上参数名,这样会显得更清晰。
// 推荐
var point = CGRect(x: 0, y: 10, width: 200, height: 120)
// 不推荐
var point = CGRectMake(0, 10, 200, 120)
这样的初始化方式虽然会长一些(其实可以用自动完成我会说?),但每个参数都被清晰地标记出来。对结构体常量的使用我们推荐用CGRect.zeroRect而不用CGRectZero。对于一个已经存在的变量,你可以使用如下的缩写方式而不用敲出整个类型名。
view.frame = .zeroRect
这种写法反映出了Swift可以使用名字空间。用户定义的常量包含在结构体自身的定义里面。我们希望这种写法能提高代码的易读性。
四、Protocol Conformance 协议
class MyViewController: UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate
当然,我们不能阻止你让view controller变得那么臃肿~~汗... 但建议你使用下面这种方式,让每条协议在其各自的extension中声明。
class MyViewController {
// Standard view controller stuff here
}
extension MyViewController: UITableViewDelegate {
// Table view delegate methods here
}
extension MyViewController: UITextFieldDelegate {
// Text field delegate methods here
}
// etc.