Swift语言编程风格指导:12月更新

本文翻译自: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.




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值