1 命名
使用駝峰式給類,方法或者變量等。類命名必須大寫,然后方法名和變量應(yīng)該以小寫字母開始。
eg 首選的
private let maximumWidgetCount = 100
class WidgetContainer {
var widgetButton:UIButton?
let widgetHeightPercentage = 0.85
}
以下的方式是非首選的
let MAX_WIDGET_COUNT = 100
class app_widgetContainer {
var wBut:UIButton?
let wHeightPct = 0.85
}
對(duì)于函數(shù)和初始化方法,除非上下文比較明朗,對(duì)所有參數(shù)命名。包括外部參數(shù)名如果它使得函數(shù)調(diào)用更加可讀
swift
func dateFromString(dateString:String)->NSDate
func convertPointAt(column column:Int.row:Int) ->CGPoint
func timedAction(afterDelay delay:NSTimeInterval,perform action:SKAction)->SKAction
應(yīng)該這樣調(diào)用
dateFromString(“2016-03-29”)
convertPointAt(column:7,row:13)
timedAction(afterDelay:1.0,perform:someOtherAction)
對(duì)于方法,遵循標(biāo)準(zhǔn)的蘋果會(huì)話指的是第一個(gè)參數(shù)的方法名稱:
swift
class Counter {
func combineWith(otherCounter:Counter,options:Dictionary?) {…}
func incrementBy(amount:Int) {….}
}
#enumerations枚舉
使用大寫的駝峰式命名定義枚舉值
enum Shape {
case Rectangle
case Square
case Triangle
case Circle
}
#單調(diào)prose
指函數(shù)散文(教程、書籍、評(píng)論)包括從調(diào)用者的角度或“_”未命名參數(shù)的要求的參數(shù)名稱
。
調(diào)用 “convertPointAt“通過你自己的初始化實(shí)現(xiàn)
如果你調(diào)用 dateFromString()_:必須確認(rèn)你提供了一個(gè)帶有“yyyy-MM-dd”的字符串
如果你通過ViewDidLoad()去調(diào)用timedAction(afterDelay:perform:)記得添加一個(gè)調(diào)整過的延遲值和一個(gè)執(zhí)行的動(dòng)作
你不應(yīng)該直接調(diào)用數(shù)據(jù)源方法-tableView(_:cellForRowAtIndexPath:)
#類前綴
swift類型是由模塊自動(dòng)名稱空間,其中包含它們,你不應(yīng)該添加一個(gè)類前綴。如果兩個(gè)名字來自不同模塊碰撞可以通過加前綴消除歧義類型名稱和模塊名稱。為什么加類前綴呢,就是為了消除多個(gè)模型的歧義這樣編譯器處理時(shí)好做區(qū)分。
#import SomeModules
let myClass = MyModule.UsefulClass()
#spacing間隔
縮進(jìn)使用2個(gè)空間而不是保護(hù)空間和防止線包裝標(biāo)簽。一定要設(shè)置這個(gè)偏好在Xcode和項(xiàng)目設(shè)置如下所示:
方法間隔和其他間隔總是在向同一行作為陳述句打開,但是在新的一行關(guān)閉
建議:你能預(yù)間隔通過選擇一些代碼例如 comman+A是選擇所有然后control +i。Xcode模板中的一些有四個(gè)間隔tab的硬編碼因此這是一個(gè)好的辦法去修正它。
#首選的
if user.isHappy {
//Do something
}else {
//Do something else
}
#非首選的格式
if user.isHappy
{
//Do something
}
else {
//Do something else
}
方法之間應(yīng)該有一個(gè)空行方法幫助視覺清晰度和組織。空格內(nèi)方法應(yīng)該單獨(dú)的功能,但太多的部分在一個(gè)方法中通常意味著你應(yīng)該重構(gòu)為幾個(gè)方法。
##comments注釋
當(dāng)它們是必須的,用注釋去解釋**why**代碼的一個(gè)詳細(xì)塊做一些事情。注釋應(yīng)該保持最新或被刪除
用。避免注釋內(nèi)聯(lián)代碼塊,因?yàn)榇a應(yīng)盡可能自我文檔。*例外:這并不適用于這些注釋用于生成文檔。*
##類和結(jié)構(gòu)
使用哪個(gè),記住,結(jié)構(gòu)體是值類型,對(duì)于一些事使用結(jié)構(gòu)體(沒有一個(gè)特性)。一個(gè)數(shù)組包含a,b,c,和其他包含a,b,c的數(shù)組是一樣的,它們是完全可交換的。你是否用第一個(gè)數(shù)組或是第二個(gè)完全沒有關(guān)系,因?yàn)槟愦淼氖菧?zhǔn)確的同一件事,這就是為什么數(shù)組是結(jié)構(gòu)體
類屬于引用類型,用類來聲明一些事情有一個(gè)特性或一個(gè)特殊的生命周期。你用一個(gè)類建模一個(gè)人因?yàn)槎€(gè)人的對(duì)象是二個(gè)不同的事情,僅僅因?yàn)槎€(gè)人有相同的名字和生日,這并不意味它們是同一個(gè)人。但是人的生日能是一個(gè)結(jié)構(gòu)體因?yàn)槿掌诤土硗庖粋€(gè)日期是相同的,日期本身沒有一個(gè)同一性。
有時(shí)候,事情是結(jié)構(gòu)體但是必須遵從AnyObject 或以往已經(jīng)用類來建模,試著盡可能緊密地遵從這些指引。
以下是一個(gè)例子-風(fēng)格較好的類定義
class Circle:Shape {
var x:Int,y:Int
var radius:Double
var diameter:Double {
get {
return radius * 2
}
set {
radius = newValue /2
}
}
init(x:Int,y:Int,radius:Double) {
self.x = x
self.y = y
self.radius = radius
}
convenience init(x:Int,y:Int,diameter:Double) {
self.init(x:x,y:y,radius:diameter/2)
}
func describle() ->String {
return “I’m a circle at\(centerString()) with an area of\(computeArea())”
}
override func computerArea() ->Double {
return M_PI * radius * radius
}
override func centerString() ->String {
return “\(x),\(y)”
}
以上展示的例子-遵從下面的風(fēng)格指導(dǎo)
1,加匹配類型給屬性,變量,常量,聲明參數(shù)和用括號(hào)的陳述句 例如:x:Int
2,如果它們分享一個(gè)共同的目的或上下文,在單行上定義多個(gè)變量和結(jié)構(gòu)
3,縮排getter和setter定義和屬性觀察
4,不要增加修飾語例如 internal-當(dāng)它們已經(jīng)是默認(rèn)的。簡單來說,當(dāng)重寫一個(gè)方法時(shí)不要重復(fù)存取修飾符
#self的使用
簡潔來說,自從swift不要求它去存取一個(gè)對(duì)象的屬性或調(diào)用它的方法,消除了使用self。
當(dāng)初始化器中區(qū)分屬性名稱和參數(shù)時(shí),用self。當(dāng)在一個(gè)閉包表達(dá)式中引用一個(gè)屬性時(shí),如果使用self容易造成循環(huán)引用進(jìn)而會(huì)內(nèi)存泄露
Eg
class BoradLocation {
let row:Int,column:Int
init(row:Int,column:Int) {
self.row = row
self.column = column
let closure? = {
print(self.row)
}
}
}
#協(xié)議一致性
當(dāng)增加協(xié)議的一致性給類時(shí),最好增加一個(gè)獨(dú)立的類擴(kuò)展給協(xié)議方法。這將保持相關(guān)的方法用協(xié)議分組,兵器簡化指令去增加一個(gè)協(xié)議給一個(gè)有它相關(guān)方法的類。
不要忘記//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 here
}
-不推薦的
Class MyViewController:UIViewController,UITableViewDataSource,UIScrollViewDelegate {
//all methods
}
#計(jì)算屬性
簡潔說來,如果一個(gè)計(jì)算屬性是只讀的,省略get子句,當(dāng)一個(gè)set子句是提供的,get子句僅僅是要求
eg,最佳選擇
var diameter:Double {
return radius * 2
}
非最佳的寫法
var? diameter:Double {
get {
return radius * 2
}
}
##函數(shù)聲明
包含一個(gè)開括號(hào)在一行內(nèi)定義一個(gè)短函數(shù)
fun? reticulateSplines(spline:[Double]) ->Bool {
}
對(duì)于帶有長署名的函數(shù)而言,在適當(dāng)?shù)狞c(diǎn)中斷 然后在下一行增加一個(gè)特別的縮排
func reticulateSplines(spline: [Double], adjustmentFactor: Double,
translateConstant: Int, comment: String) -> Bool {
// reticulate code goes here
}
#閉包表達(dá)式
如果在參數(shù)列表的皆為有一個(gè)單獨(dú)的閉包表達(dá)式參數(shù),使用拖尾閉包,給閉包參數(shù)敘述性的名字
eg-最佳書寫規(guī)范
UIView,animateWithDuration(1.0) {
self.myView.alpha = 0
}
UIView.animateWithDuration(1.0,animations: {
self.myView.alpha = 0
},
completion: { finished in self,myView.removeFromSuperView()
}
)
-非首選的書寫規(guī)范
UIView.animateWithDuration(1.0,animations: {
self.myView.alpha = 0
})
UIView.animateWithDuration(1.0,
animations:{
self,myView.alpha = 0
}) { f in
self.myView.removeFromSuperView()
}
當(dāng)上下文明朗的,單一表達(dá)式閉包用隱式返回
attendeeList.sort { a,b in
a > b
}
##類型
當(dāng)可用時(shí),總是使用swift本地類型。swift提供橋接到objective-C-因此你可用使用所有系列的方法
eg首選
let width = 120.0
let widthString = (width as NSNumber).stringValue
eg-糟糕的書寫方式
let width:NSNumber = 120.0
let widthString :NSString = width.stringValue
在sprite kit代碼中如果通過避免過多的轉(zhuǎn)換來使代碼更加簡潔,用CGFloat
#constants常量
常量使用let關(guān)鍵字定義,變量則用var關(guān)鍵字去定義。如果變量的值將不做更改,用let代替var
如果編譯器抱怨,定義任何事物用let,僅僅更改它為var。編譯器會(huì)給你tip。
##可選值
當(dāng)一個(gè)空值是可以被接收的,聲明變量和函數(shù)返回值類型為可選值,對(duì)于實(shí)例變量(你知道的在使用前必須初始化)隱式強(qiáng)制解包用!例如在viewDidLoad中將被安裝的子視圖。
如果這個(gè)值僅僅存取一次或是在鏈中有多個(gè)可選值時(shí),當(dāng)你存取一個(gè)可選值時(shí),使用可選鏈
例如
self.textContainer?.textLabel?.setNeedDisplay()
當(dāng)解包一次或執(zhí)行多重的操作時(shí)使用可選綁定更加方便
eg
if let textContainer = self.textContainer {
//do many things with textContainer
}
當(dāng)命名可選變量或?qū)傩詴r(shí),當(dāng)他們的可選類型已經(jīng)在類型中聲明時(shí)避免這樣的命名例如 optionalString,maybeView
-明智的選擇
var subview:UIView?
var volume:Double?
var name:String?
//
if let subview = subview,volume = volume,name = name {
//do something with unwrapped subview ,volume and name
}
糟糕的命名
var optionalSubview:UIView?
var volume:Double?
if let unwrappedSubview = optionalSubview {
if let realVolume = volume {
//do something with unwrappedSubview and realVolume
}
}
#結(jié)構(gòu)初始化器
最好使用本地的swift結(jié)構(gòu)初始化器去代替原有的初始化器
明智的選擇
let bounds = CGRect(x:40,y:40,width:100,height:80)
let centerPoint = CGPoint(x:97,y:87)
糟糕的使用
let bounds = CGRectMake(40,20,30,45)
let centerPoint = CGPointMake(97,87)
#類型推斷
參考緊湊的代碼,讓編譯器推斷的類型常量或變量,除非你需要一個(gè)特定類型的默認(rèn) .例如,CGFloat,Int16
首要的選擇規(guī)范
let message = “Click the button”
let currentBounds = computerViewBounds()
var names = [String]()
let maximumWidth:CGFloat = 106.5
糟糕的書寫規(guī)范
let message :String = “Click the button”
let currentBounds :CGRect = computerViewBounds()
var names:[String] =[]
備注:下面這條指導(dǎo)原則意味著選擇描述性的名字比以前更加重要。
#語法糖
喜歡快捷版本完整的泛型類型聲明的語法。
eg:
var deviceModels:[String]
var employees:[Int:String]
var faxNumber:Int?
糟糕的書寫規(guī)范
var deviceModels:Array
var employees:Dictionary
var faxNumber:Optional
#控制流
使用for-in代替for循環(huán)
首選的書寫規(guī)范
for _ in 0..<3 {
print(“Hello,three times”)
}
for (index,person) in attendeeList.enumerate() {
print(“\(person) is at position? \(index)”)
}
糟糕的書寫規(guī)范
for var i = 0;i < 3;i++ {
print(“hello,three times”)
}
for var i = 0;i < attendeeList.count;i++ {
let person = attendeeList[i]
print(“\(person) is at position \(i)”)
}
#分號(hào)
在你的代碼中每一個(gè)陳述句后swift不要求分號(hào),如果你希望在單行上結(jié)合多長陳述句,要加分號(hào)
不要在分號(hào)分開的單行寫多重陳述句
唯一的例外是“for-conditional-increment”構(gòu)造,這就需要分號(hào)。然而,選擇“for-in”結(jié)構(gòu)應(yīng)該在可能的情況下使用。
首選的代碼書寫方式
let swift = “not a scripting language”
糟糕的書寫方式
let swift = “not a scripting language”;
備注:
swift不同于JavaScript,在省略分號(hào)(通常被認(rèn)為不安全)
#語言
用美式英語拼寫去匹配蘋果API
首選的書寫方式
let? color = “red”
不建議采用的書寫規(guī)范
let colour = “red”