## 類型(Types)
盡可能使用 Swift 原生類型。Swift 提供到 Objective-C 類型的橋接,所以你仍然可以使用許多需要的方法。
推薦做法:
~~~
let width = 120.0 // Double
let widthString = (width as NSNumber).stringValue // String
~~~
不推薦做法:
~~~
let width: NSNumber = 120.0 // NSNumber
let widthString: NSString = width.stringValue // NSString
~~~
在 Sprite Kit 代碼中,使用 CGFloat 可以使得代碼更加簡明,避免很多轉換。
### 常量(Constants)
常量定義使用?`let`?關鍵字,變量定義使用?`var`?關鍵字,如果變量的值不需要改變,請盡量使用?`let`?關鍵字。
提示:一個好的技巧是,使用?`let`?定義任何東西,只有在編譯器告訴我們值需要改變的時候才改成?`var`?定義。
### 可選類型(Optionals)
當nil值是可以接受的時候時,定義變量和函數返回值為可選類型(?)。
當你確認變量在使用前已經被初始化時,使用!來顯式的拆包類型,比如在`viewDidLoad`中會初始化`subviews`。
當你訪問一個可選值時,如果只需要訪問一次或者在可選值鏈中有多個可選值時,請使用可選值鏈:
~~~
self.textContainer?.textLabel?.setNeedsDisplay()
~~~
當需要很方便的一次性拆包或者添加附加的操作時,請使用可選值綁定:
~~~
if let textContainer = self.textContainer {
// do many things with textContainer
}
~~~
當我們命名一個可選變量和屬性時,避免使用諸如`optionalString`和`maybeView`這樣的命名,因為可選值的表達已經在類型定義中了。
在可選值綁定中,直接映射原始的命名比使用諸如`unwrappedView`和`actualLabel`要好。
推薦做法:
~~~
var subview: UIView?
var volume: Double?
// later on...
if let subview = subview, volume = volume {
// do something with unwrapped subview and volume
}
~~~
不推薦做法:
~~~
var optionalSubview: UIView?
var volume: Double?
if let unwrappedSubview = optionalSubview {
if let realVolume = volume {
// do something with unwrappedSubview and realVolume
}
}
~~~
### 結構體構造器(Struct Initializers)
使用原生的 Swift 結構體構造器,比老式的幾何類(CGGeometry)的構造器要好。
推薦做法:
~~~
let bounds = CGRect(x: 40, y: 20, width: 120, height: 80)
let centerPoint = CGPoint(x: 96, y: 42)
~~~
不推薦做法:
~~~
let bounds = CGRectMake(40, 20, 120, 80)
let centerPoint = CGPointMake(96, 42)
~~~
推薦使用結構體限定的常量`CGRect.infiniteRect`,`CGRect.nullRect`等,來替代全局常量`CGRectInfinite`,`CGRectNull`等。對于已經存在的變量,可以直接簡寫成?`.zeroRect`。
### 類型推斷(Type Inference)
推薦使用更加緊湊的代碼,讓編譯器能夠推斷出常量和變量的類型。除非你需要定義一個特定的類型(比如`CGFloat`和`Int16`),而不是默認的類型。
推薦做法:
~~~
let message = "Click the button"
let currentBounds = computeViewBounds()
var names = [String]()
let maximumWidth: CGFloat = 106.5
~~~
不推薦做法:
~~~
let message: String = "Click the button"
let currentBounds: CGRect = computeViewBounds()
var names: [String] = []
~~~
注意:遵守這條規則意味選擇描述性命名比之前變得更加重要。
### 語法糖(Syntactic Sugar)
推薦使用類型定義簡潔的版本,而不是全稱通用語法。
推薦做法:
~~~
var deviceModels: [String]
var employees: [Int: String]
var faxNumber: Int?
~~~
不推薦做法:
~~~
var deviceModels: Array<String>
var employees: Dictionary<Int, String>
var faxNumber: Optional<Int>
~~~