這篇文章是基于SwiftLint總結(jié)的Swift4.0編碼規(guī)范烹玉。這個(gè)規(guī)范還在不斷的擴(kuò)充中驰怎,我挑了其中我認(rèn)為需要注意的幾點(diǎn),做了以下記錄二打。因?yàn)槭且?guī)范县忌,不存對(duì)與錯(cuò),只存在是否合適继效,是否有利于別人閱讀咱們的代碼症杏。另外為了方便說(shuō)明每條規(guī)則,我在規(guī)則下面都加了幾條推薦的寫(xiě)法和不推薦的寫(xiě)法瑞信。
命名規(guī)范
1.標(biāo)識(shí)符名稱(chēng)應(yīng)該只包含字母數(shù)字字符厉颤,以小寫(xiě)字符開(kāi)頭,或者只包含大寫(xiě)字母凡简。在上述情況下逼友,變量名可以在聲明靜態(tài)和不可變的時(shí)候以大寫(xiě)字母開(kāi)頭。變量名不應(yīng)該太長(zhǎng)或太短秤涩。
let myLet = 0 //推薦
let i = 0//不推薦帜乞,太短
- 類(lèi)型名應(yīng)該只包含字母數(shù)字字符,以大寫(xiě)字符開(kāi)頭溉仑,長(zhǎng)度在3到40個(gè)字符之間。
class MyType {}
- Bool類(lèi)型命名時(shí)状植,使用is作為前綴浊竟;Bool類(lèi)型聲明時(shí)怨喘,更應(yīng)該選擇非可選性。
let isEnable: Bool = false//推薦
let foo: Bool? = nil //不推薦
- Swift中類(lèi)別(類(lèi)振定,結(jié)構(gòu)體)在編譯時(shí)會(huì)把模塊設(shè)置為默認(rèn)的命名空間必怜,所以不用為了區(qū)分類(lèi)別而添加前綴,比如XYHomeViewController后频,但是為了和引用的第三方庫(kù)作區(qū)分梳庆,建議可以繼續(xù)使用前綴,以作為規(guī)范化處 理卑惜,結(jié)構(gòu)更清晰膏执。
- 數(shù)組和字典變量定義時(shí)需要標(biāo)明泛型類(lèi)型,并使用更簡(jiǎn)潔清晰的語(yǔ)法露久。
let list: [String] = []
let dict: [String:Int] = [:]
- 在指定類(lèi)型時(shí)更米,冒號(hào)應(yīng)該在標(biāo)識(shí)符旁邊,冒號(hào)后應(yīng)有一個(gè)空格毫痕。
let abc: String = "def"http://推薦
let abd : String = "def"http://不推薦
func abc(def: Void, ghi: Void) {}//推薦
函數(shù)使用
- 函數(shù)的行數(shù)應(yīng)該控制在40行或更短征峦,不包括注釋和空格
- 一行的長(zhǎng)度應(yīng)為120個(gè)字符或更少
- 默認(rèn)參數(shù)應(yīng)該出現(xiàn)在參數(shù)列表末尾
func foo(x: String, y: Int = 0, z: CGFloat = 0) {}//推薦
- 與傳統(tǒng)的便利功能相比,Swift構(gòu)造函數(shù)更受青睞消请。
CGPoint(x: 10, y: 10)//推薦
CGPointMake(10, 10)//不推薦
5.鏈?zhǔn)胶瘮?shù)調(diào)用應(yīng)該是在同一行上栏笆,或者是每行一個(gè)。多個(gè)參數(shù)時(shí)也遵循這個(gè)原則
let evenSquaresSum = [20, 17, 35, 4].filter { $0 % 2 == 0 }.map { $0 * $0 }.reduce(0, +)//推薦
let chain = a
.b(1, 2, 3)
.c { blah in
print(blah)
}
.d()//推薦
- 當(dāng)函數(shù)的第一個(gè)參數(shù)構(gòu)成整個(gè)語(yǔ)句的介詞時(shí)(如臊泰,at, by, for, in, to, with
等)蛉加,為第一個(gè)參數(shù)添加介詞參數(shù)標(biāo)簽
func login(with username: String?, password: String?) {
//
}
7.未實(shí)現(xiàn)的函數(shù)應(yīng)該標(biāo)記為不可用
class ViewController: UIViewController {
@available(*, unavailable)
public required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
書(shū)寫(xiě)規(guī)范
- 任何逗號(hào)前后都不應(yīng)有空格,在逗號(hào)后面加一個(gè)空格
func abc(a: String, b: String) { }//推薦
- 打開(kāi)括號(hào)前應(yīng)該有一個(gè)空格因宇,并與聲明在同一行上七婴。
1.func abc() {
}//推薦
2.[].map() { $0 }//推薦
3.struct Rule
{
}//不推薦
- 盡量不使用'self.'除非方法參數(shù)與屬性同名。
init(x: Int, y: Int, radius: Double) {
self.x = x
self.y = y
self.radius = radius
}//推薦
self.tableView.delegate = self//不推薦
- 盡量避免使用強(qiáng)制解包察滑,強(qiáng)制try打厘。
if let url = NSURL(string: query)//推薦
let url = NSURL(string: query)!//不推薦
func a() throws {}; do { try a() } catch {}//推薦
func a() throws {}; ↓try! a()//不推薦
- 只讀計(jì)算屬性的聲明可以去掉 get 關(guān)鍵字和花括號(hào)。
class Foo {
var foo: Int {
return 20
}
}//推薦
6.更喜歡初始化器而不是可視化構(gòu)造器贺辰。
let image = UIImage(named: aVariable)//推薦
let image = #imageLiteral(resourceName: "image.jpg")//不推薦
7.更喜歡使用isEmpty
而不是用count
判斷是否為空户盯。
[Int]().isEmpty//推薦
[Int]().count > 0//不推薦
myString == ""http://不推薦
8.更喜歡用private
而不是fileprivate
修飾內(nèi)容。
private extension String {}
- 條件語(yǔ)句應(yīng)該總是返回到下一行饲化。
if true { break } else { return }//不推薦
9.注釋的規(guī)范使用
// MARK: ... //'MARK:' 前后均有空格
// FIXME: - ...// '-'前后有空格
10.不要遺留FIXM
和TODO
莽鸭,要解決掉
11.所有聲明都應(yīng)該顯式地指定訪(fǎng)問(wèn)控制級(jí)別的關(guān)鍵字。
private let address: String//推薦
var age: Int = 0 //不推薦
12.一個(gè)文件的內(nèi)容不應(yīng)該超過(guò)400行
13.每一行的末尾吃靠,避免出現(xiàn)分號(hào)
let title: String = "ferry";//不推薦