引见
Swift的编码风格大部分和OC的编码风格一致,在前一篇文章Objective-C编程风格指南中已经提出,在这里就不重复了,只写一些不同的地方。
空格
直接上例子
首选:
if user.isHappy {
// Do something
} else {
// Do something else
}
Not 首选:
if user.isHappy
{
// Do something
}
else {
// Do something else
}
Self的使用
一般为了简洁,不需要使用self去引用属性,区分参数与属性需要使用self,在闭包表达式中引用属性需要使用self。
class BoardLocation {
let row: Int, column: Int
init(row: Int, column: Int) {
self.row = row
self.column = column
let closure = {
println(self.row)
}
}
}
协议的使用
当给一个类添加协议时,最好为类写一个遵循这个协议的类扩展。这样有利于把协议的方法与协议联系在一起。
记得用// MARK: -
添加一个协议注释。
首选:
class MyViewcontroller: UIViewController {
// class stuff here
}
// MARK: - UITableViewDataSource
extension MyViewcontroller: UITableViewDataSource {
// table view data source methods
}
// MARK: - UIScrollViewDelegate
extension MyViewcontroller: UIScrollViewDelegate {
// scroll view delegate methods
}
Not 首选:
class MyViewcontroller: UIViewController, UITableViewDataSource, UIScrollViewDelegate {
// all methods
}
计算属性
当计算属性为只读时,一般直接返回值即可,只有当提供了set方法时,需要提供get方法。
首选:
var diameter: Double {
return radius * 2
}
Not 首选:
var diameter: Double {
get {
return radius * 2
}
}
类型声明
Swift拥有很好的自动类型推断。
首选:
let width = 120.0 // Double
let widthString = (width as NSNumber).stringValue // String
Not 首选:
let width: NSNumber = 120.0 // NSNumber
let widthString: NSString = width.stringValue // NSString
可选值
使用可选值之前,应该进行非空判断。
首选:
var subview: UIView?
var volume: Double?
// later on...
if let subview = subview, volume = volume {
// do something with unwrapped subview and volume
}
Not 首选:
var optionalSubview: UIView?
var volume: Double?
if let unwrappedSubview = optionalSubview {
if let realVolume = volume {
// do something with unwrappedSubview and realVolume
}
}
结构初始化
首选:
let bounds = CGRect(x: 40, y: 20, width: 120, height: 80)
let centerPoint = CGPoint(x: 96, y: 42)
Not 首选:
let bounds = CGRectMake(40, 20, 120, 80)
let centerPoint = CGPointMake(96, 42)
泛型声明
首选:
var deviceModels: [String]
var employees: [Int: String]
var faxNumber: Int?
Not 首选:
var deviceModels: Array<String>
var employees: Dictionary<Int, String>
var faxNumber: Optional<Int>
For循环
使用for-in
循环代替一般for循环方式。
首选:
for _ in 0..<3 {
println("Hello three times")
}
for (index, person) in attendeeList.enumerate() {
println("\(person) is at position #\(index)")
}
Not 首选:
for var i = 0; i < 3; i++ {
println("Hello three times")
}
for var i = 0; i < attendeeList.count; i++ {
let person = attendeeList[i]
println("\(person) is at position #\(i)")
}