函數(shù)聲明
讓函數(shù)聲明短到能在一行內(nèi)顯示,包括左花括號(hào):
func reticulateSplines(spline: [Double]) ->Bool
{
// reticulate code goes here
}
對(duì)于一些比較長的函數(shù)聲明,可以在適當(dāng)?shù)牡胤綋Q行,同時(shí)要在子行加上額外的縮進(jìn)
func reticulateSplines(spline: [Double], adjustmentFactor: Double,
translateConstant: Int, comment: String) -> Bool{
// reticulate code goes here
}
閉包表達(dá)式
只有當(dāng)參數(shù)列表后面僅有一個(gè)單獨(dú)的閉包表達(dá)式參數(shù)時(shí),使用后關(guān)閉的語法。閉包的參數(shù)要給描述性的命名
推薦
UIView.animateWithDuration(1.0) {
self.myView.alpha = 0
}
UIView.animateWithDuration(1.0,
animations: {
self.myView.alpha = 0
},
completion: { finished in
self.myView.removeFromSuperview()
}
)
不推薦
UIView.animateWithDuration(1.0, animations: {
self.myView.alpha = 0
})
UIView.animateWithDuration(1.0,
animations: {
self.myView.alpha = 0
}) { f in
self.myView.removeFromSuperview()
}
對(duì)于內(nèi)容很清晰的單個(gè)閉包表達(dá)式,使用隱式的返回
attendeeList.sort
{ a, b in
a > b
}
類型
推薦使用Swift的原生類型。Swift提供了OC的橋接,所以如果需要你仍然可以使用原生的全部方法
推薦
let width =120.0 // Double
let widthString =(width as NSNumber).stringValue // String
不推薦
let width: NSNumber = 120.0 // NSNumber
let widthString: NSString =width.stringValue // NSString
在SpriteKit的代碼中,為了使代碼更簡(jiǎn)潔,避免太多轉(zhuǎn)換,使用CGFloat
常量
常量被關(guān)鍵字let定義,變量被關(guān)鍵字var定義,所以如果變量的值不改變推薦使用let而不是var
Tip:一個(gè)好的技巧就是先用let定義所有變量,只有當(dāng)編譯器報(bào)錯(cuò)了才改成var
可選
當(dāng)變量或函數(shù)返回類型的值可為nil時(shí),用?號(hào)聲明其為可選類型
只有那些你知道會(huì)在使用前已初始化的實(shí)例變量,比如子視圖會(huì)在viewDidLoad中建立中(涉及到的變量),你才能使用!號(hào)聲明的拆包類型
當(dāng)訪問一個(gè)可選值時(shí),使用可選鏈,如果值是僅被訪問一次或者鏈中有許多個(gè)可選類型。
self.textContainer?.textLabel?.setNeedsDisplay()
使用可選(optional binding)綁定,會(huì)讓一次拆包和執(zhí)行多個(gè)操作更方便
if lettextContainer = self.textContainer {
// do many things with textContainer
}
當(dāng)命名可選變量或?qū)傩詴r(shí),避免將他們命名為optionalString 或maybeView,因?yàn)樗麄冊(cè)诼暶魇蔷鸵呀?jīng)是聲明為可選的了。
對(duì)于可選綁定來說,跟隨原值命名而不是使用一些像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 letunwrappedSubview = optionalSubview {
if letrealVolume = volume {
// do something with unwrappedSubview
and realVolume
}
}
結(jié)構(gòu)初始化
使用原生的Swift結(jié)構(gòu)初始化而不是傳統(tǒng)的CGGeometry構(gòu)造函數(shù)
推薦
let message ="Click the button"
letcurrentBounds = computeViewBounds()
var
names =[String]()
let maximumWidth: CGFloat = 106.5
不推薦
let message: String = "Click
the button"
let currentBounds: CGRect =
computeViewBounds()
varnames: [String] =[]
注意:遵守這份指南意味著選擇描述性命名比以往任何情況都重要。
語法糖
推薦更便捷的類型聲明而不是寫通用語法
推薦
var deviceModels: [String]
var employees: [Int: String]
varfaxNumber: Int?
不推薦
var deviceModels: Array<String>
var employees: Dictionary<Int, String>
varfaxNumber: Optional<Int>
控制流
推薦for-in而不是for-condition-increment類型
推薦
for _ in0..<3 {
println("Hello three times")
}
for (index, person) in
attendeeList.enumerate() {
println("\(person) is at position #\(index)")
}
不推薦
for vari = 0; i <3; i++ {
println("Hello three times")
}
for vari = 0; i <attendeeList.count;
i++{
let person =attendeeList[i]
println("\(person) is at position #\(i)")
}
分號(hào)
Swift不需要在你代碼中的每個(gè)語句后加分號(hào),只有當(dāng)你需要在一行中寫多個(gè)語句時(shí)才用到。
不要在一個(gè)單行上寫多個(gè)語句。
只有在for-condition-increment結(jié)構(gòu)的情況下需要用多個(gè)分號(hào)。然而有可選的for-in結(jié)構(gòu)可以使用。
推薦
let swift ="not a scripting language"
不推薦
let swift ="not a scripting language";
注意:Swift和JavaScript非常不同,(JavaScript)省略分號(hào)通常是不安全的
語言
使用英式英語來拼寫蘋果的api
推薦
let color ="red"
不推薦
let colour ="red"