程序代碼中到處都是自己定義的名字,取一個有樣並且符合規范的名字非常重要。
命名方法很多,但是比較有名的,廣泛接受命名法有:
-
匈牙利命名,一般只是命名變量,原則是:變量名=類型前綴+描述,如bFoo表示布爾類型變量,pFoo表示指針類型變量。匈牙利命名還是有一定爭議的,在Swift編碼規范中幾本不采用匈牙利命名。
駝峰命名是Swift編碼規范主要的命名方法,更加所命名的內容不同,可以選擇小駝峰法還是大駝峰法。下面分類說明一下:
-
對類、結構體、枚舉和協議等類型命名,應該采用大駝峰法,如SplitViewController。
-
文件名,采用大駝峰法,如BlockOperation.swift。
-
擴展文件,有的時候擴展是定義在一個獨立的文件中的,它的命名是“原始類型名+擴展名”作為擴展文件名,如NSOperation+Operations.swift。
-
變量和屬性,采用應該采用小駝峰法,如studentNumber。
-
常量,采用大駝峰法,如MaxStudentNumber。
-
枚舉成員,與常量類似,采用大駝峰法,如ExecutionFailed。
-
函數和方法,采用應該采用小駝峰法,如balanceAccount、isButtonPressed等。
=================================
前面說到Swift注釋的語法有兩種:單行注釋(//)和多行注釋(/*...*/)。這里來介紹一下他們的使用規范。
1、文件注釋
文件注釋就在每一個文件開頭添加注釋,文件注釋通常包括如下信息:版權信息、文件名、所在模塊、作者信息、歷史版本信息、文件內容和作用等。
下面看一個文件注釋的示例:
- /*
- Copyright (C) 2015 Eorient Inc. All Rights Reserved.
- See LICENSE.txt for this sample’s licensing information
- Description:
- This file contains the foundational subclass of NSOperation.
- History:
- 15/7/22: Created by Tony Guan.
- 15/8/20: Add socket library
- 15/8/22: Add math library
- */
這個注釋只是提供了版權信息、文件內容和歷史版本信息等,文件注釋要根據自己實際情況包括內容。
2、文檔注釋
文檔注釋就是這種注釋內容能夠生成API幫助文檔。文檔注釋主要對類型、屬性、方法或函數等功能。
文檔注釋是稍微將單行注釋(//)和多行注釋(/*...*/)做一點“手腳”后,就成為了文檔注釋,單行文檔注釋(///)和多行文檔注釋(/**...*/)。
下面代碼示例:
- import Foundation
- /**
- The protocol that types may implement if they wish to be
- notified of significant operation lifecycle events.
- */
- protocol OperationObserver {
- /// Invoked immediately prior to the `Operation`'s `execute()` method.
- func operationDidStart(operation: Operation)
- }
代碼中使用了文檔注釋。
可以使用一些工具將這些文檔注釋生成API文件
3、代碼注釋
程序代碼中處理文檔注釋還需要在一些關鍵的地方添加代碼注釋,文檔注釋一般是給一些看不到源代碼的人看的幫助文檔,而代碼注釋是給閱讀源代碼人參考的。代碼注釋一般是采用單行注釋(//)和多行注釋(/*...*/)。
有的時候也會在代碼的尾端進行注釋,這要求注釋內容極短,應該在有足夠的空白來分開代碼和注釋。尾端注釋示例代碼如下:
- init(timeout: NSTimeInterval) {
- self.timeout = timeout //初始化
- }
4、使用地標注釋
隨着編碼過程深入,工程代碼量會增加,任何在這大量的代碼中能快速找到需要方法或者是剛才修改過代碼呢?
在Swift代碼中使用地標注釋,然后就可以使用Xcode工具在代碼中快速查找了。地標注釋有三個:
-
MARK,用於方法或函數的注釋。
-
TODO,表示這里代碼有沒有完成,還要處理。
-
FIXME,表示這里修改了代碼。
這些注釋會出現在Xcode的 Jump Bar中。來看一個示例:
- class ViewController: UIViewController,
- ÊUITableViewDataSource, UITableViewDelegate {
- var listTeams: [[String:String]]!
- override func viewDidLoad() {
- super.viewDidLoad()
- ...
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- //TODO: 釋放資源 //使用TODO注釋
- }
- // MARK: UITableViewDataSource 協議方法 //使用MARK注釋
- func tableView(tableView: UITableView,
- ÊnumberOfRowsInSection section: Int) -> Int {
- return self.listTeams.count
- }
- func tableView(tableView: UITableView,
- ÊcellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
- let cellIdentifier = "CellIdentifier"
- let cell: UITableViewCell! = tableView
- Ê.dequeueReusableCellWithIdentifier(cellIdentifier,
- ÊforIndexPath: indexPath) as? UITableViewCell
- // FIXME: 修改bug //使用了FIXME注釋
- let row = indexPath.row
- let rowDict = self.listTeams[row] as [String:String]
- ...
- return cell
- }
- // MARK: UITableViewDelegate 協議方法 //使用MARK注釋
- func tableView(tableView: UITableView,
- ÊdidSelectRowAtIndexPath indexPath: NSIndexPath) {
- ...
- }
- }
上述代碼中使用三種地標注釋,在使用時候后面要跟有一個冒號(:)。
注釋之后如果使用呢?打開Xcode的 Jump Bar,如下圖,這些地標注釋會在下拉列表中粗體顯示,點擊列表項就會跳轉到注釋行。
===============================
聲明是在聲明變量、常量、屬性、方法或函數和自定義類型時候需要遵守的規范。
首先變量或常量時每行聲明變量或常量的數量推薦一行一個,因為這樣以利於寫注釋。示例代碼如下。
推薦使用:
- let level = 0
- var size = 10
不推薦使用:
- let level = 0; var size = 10
變量或常量的數據類型,如果有可能應盡可能采用類型推斷,這樣代碼很簡潔。示例代碼如下。
推薦使用:
- let level = 0
- var size = 10
不推薦使用:
- let level: Int = 0
- var size: Int = 10
如果不是默認數據類型,需要明確聲明變量或常量的數據類型。示例代碼如下。
- let level: Int8 = 0
- var size: Int64 = 10
在指定數據類型時候需要使用冒號(:),size與冒號之間沒有空格,冒號和數據類型之間要有一個空格。示例代碼如下。
推薦使用:
- let level: Int8 = 0
- var size: Int64 = 10
不推薦使用:
- let level : Int8 = 0
- var size:Int64 = 10
使用數據類型時盡可能使用Swift本身數據類型,例如:
推薦使用:
- let width = 120.0
- let widthString = "Hello."
- var deviceModels: [String]
- var employees: [Int: String]
不推薦使用:
- let width: NSNumber = 120.0
- let widthString: NSString = "Hello."
- var deviceModels: NSArray
- var employees: NSDictionary
屬性聲明
屬性包括存儲屬性和計算屬性,如果是存儲屬性的聲明規范與變量或常量聲明的規范是一樣的。如果是計算屬性類似於代碼塊,在使用只讀計算屬性時候,如果可能要省略get語句。示例代碼如下。
推薦使用:
- var fullName : String {
- return firstName + "." + lastName
- }
不推薦使用:
- var fullName : String {
- get {
- return firstName + "." + lastName
- }
- }