Swift編碼規(guī)范

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”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,417評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評(píng)論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,204評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容

  • 2014年的蘋果全球開發(fā)者大會(huì)(WWDC),當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,306評(píng)論 0 9
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 3,854評(píng)論 0 6
  • 花了周末的時(shí)間翻譯raywenderlich.com的Swift編碼規(guī)范(傳送門), 原文是針對(duì)寫作時(shí)Swift代...
    豆志昂揚(yáng)閱讀 7,631評(píng)論 2 43
  • 132.轉(zhuǎn)換錯(cuò)誤成可選值 通過轉(zhuǎn)換錯(cuò)誤成一個(gè)可選值,你可以使用 try? 來處理錯(cuò)誤。當(dāng)執(zhí)行try?表達(dá)式時(shí),如果...
    無灃閱讀 1,274評(píng)論 0 3
  • 相親是一種特殊的情況。剛開始我還有忌諱,有辱我的形象或者不想去,但是看到家人期待我目光,于是漸漸的接受了家人的一次...
    沐府墓主閱讀 329評(píng)論 0 0