PascalCase使用駝峰命名規則和描述性的名稱來定義類、方法、變量等。類名和模塊中的常量的第一個字母應該大寫,而方法名和變量應該開始用小寫字母。這一點跟OC一樣的命名規則
推薦
class UserInfo{
var userName: String
var userAge: String
}
camelCase使用小駱駝拼寫法 (首字母小寫) 為函數,方法,變量,常量,參數等命名。
在實際使用過程中,對于函數和int函數,需對所有參數進行命名,除非上下文非常清清楚,是函數調節具有可讀性。 例子:
funcupdateUserInfo(userName: String, userAge: Int)
首字母縮略詞在命名中一般來說都是全部大寫,例外的情形是如果首字母縮略詞是一個命名的開始部分,而這個命名需要小寫字母作為開頭,這種情形下首字母縮略詞全部小寫。
// "HTML" is at the start of a constant name, so we use lowercase "html"
let htmlBodyContent: String = "<p>Hello, World!</p>"
// Prefer using ID to Idlet profileID: Int = 1
// Prefer URLFinder to UrlFinder
使用前綴 k 大駱駝命名法 為所有非單例的靜态常量命名。
不要縮寫,簡寫命名,或用單個字母命名。
// 推薦
class RoundAnimatingButton: UIButton {
let animationDuration: NSTimeInterval
func startAnimating() {
let firstSubview = subviews.first
}
}
// 不推薦
class RoundAnimating: UIButton {
let aniDur: NSTimeInterval
func srtAnmating() {
let v = subviews.first
}
}
格式在團隊開發過程中,代碼格式非常重要,保持良好的代碼編寫習慣。
每個文件結尾後又空白行。
每一行都不能以空白作為結尾。
左邊的大括号不用另起一行。
class PPClass {
func ppMethod(){
if x == y {
/* .... */
} else if x == z {
/* .... */
} else {
/* .... */
}
}
/* .... */
}
在寫一個變量、一個字典、一個函數等等的時候,在:在不加空格,在:後面加空格。
// 指定類型
let age: Int = 27
// 字典語法(注意這裡是向左對齊而不是分号對齊)
let userInfo: [String: AnyObject] = [
"userName": "Austin",
"age": 27]
// 聲明函數
func myFunction<t, u: someprotocol where t.relatedtype == u>(firstArgument: U, secondArgument: T) {
/* ... */
}
// 調用函數
someFunction(someArgument: "Austin")
// 父類
class CustomViewController: UIViewController {
/* ... */
}
// 協議
extension PirateViewController: UITableViewDataSource {
/* ... */
}</t, u: someprotocol where t.relatedtype == u>
基本上,要在,後面加空格
let array = [1, 2, 3, 4, 5]
在做二元運算符的時候前後都要需要添加空格,有時候可能讀不出來。
let sum = 20 (30 / 2) * 3
if 2 3 == 5 {
fatalError("The universe is broken.")
}
func pancake() -> Pancake {
/* ... */
}
當調用的函數有多個參數時,每一個參數另起一行,并比函數名多一個縮進。
someFunction(
first: "Hello, I am Austin",
second: resultFromSomeFunction()
third: someOtherLocalVariable)
如果要進行多條件一起判斷,盡量使用本地變量或者其他方式,增強代碼可讀性
// 推薦
let firstCondition = x == firstReallyReallyLongPredicateFunction()
let secondCondition = y == secondReallyReallyLongPredicateFunction()
let thirdCondition = z == thirdReallyReallyLongPredicateFunction()
if firstCondition && secondCondition && thirdCondition {
// 你要幹什麼
}
// 不推薦
if x == firstReallyReallyLongPredicateFunction()
&& y == secondReallyReallyLongPredicateFunction()
&& z == thirdReallyReallyLongPredicateFunction() {
// 你要幹什麼
}
風格能用let用let,盡量少用var
在對數組或者集合進行操作的時候,盡量使用高級函數map,filter,reduce
// 推薦
let stringOfInts = [1, 2, 3].flatMap { String($0) }
// ["1", "2", "3"]
// 不推薦
var stringOfInts: [String] = []
for integer in [1, 2, 3] {
stringOfInts.append(String(integer))
}
// 推薦
let evenNumbers = [4, 8, 15, 16, 23, 42].filter { $0 % 2 == 0 }
// [4, 8, 16, 42]
// 不推薦
var evenNumbers: [Int] = []
for integer in [4, 8, 15, 16, 23, 42] {
if integer % 2 == 0 {
evenNumbers(integer)
}
}
如果一個函數有多個返回值,推薦使用 元組 而不是 inout 參數, 如果你見到一個元組多次,建議使用typealias ,而如果返回的元組有三個或多于三個以上的元素,建議使用結構體或類。
func UserName() -> (firstName: String, lastName: String) {
return ("Guybrush", "Threepwood")
}
let name = UserName()
let firstName = name.firstName
let lastName = name.lastName
當使用委托和協議時,請注意避免出現循環引用,基本上是在定義屬性的時候使用 weak 修飾,在閉包裡使用 self 的時候要注意出現循環引用,使用捕獲列表可以避免這一點。
myFunctionWithClosure() { [weak self] (error) -> Void in
// 方案 1
self?.doSomething()
// 或方案 2
guard let strongSelf = self else {
return
}
strongSelf.doSomething()
}
使用if做判斷的時候,不使用()
// 推薦
if x == y {
/* ... */
}
// 不推薦
if (x == y) {
/* ... */
}
寫枚舉的時候,請簡寫
// 推薦
imageView.setImageWithURL(url, type: .person)
// 不推薦
imageView.setImageWithURL(url, type: AsyncImageView.Type.person)
在使用類方法的時候不用簡寫,因為類方法不如 枚舉 類型一樣,可以根據輕易地推導出上下文。
// 推薦
imageView.backgroundColor = UIColor.whiteColor
// 不推薦
imageView.backgroundColor = .whiteColor
不建議使用用self.修飾除非需要。
訪問修飾符不應單獨另起一行,應和訪問修飾符描述的對象保持在同一行。
// 推薦
public class Pirate {
/* ... */
}
// 不推薦
public
class Pirate {
/* ... */
}
自定義操作符
不推薦使用自定義操作符,如果需要創建函數來替代。
在重寫操作符之前,請慎重考慮是否有充分的理由一定要在全局範圍内創建新的操作符,而不是使用其他策略。
你可以重載現有的操作符來支持新的類型(特别是 ==),但是新定義的必須保留操作符的原來含義,比如 == 必須用來測試是否相等并返回布爾值。
不要使用 as! 或 try!。
如果對于一個變量你不打算聲明為可選類型,但當需要檢查變量值是否為 nil,推薦用當前值和 nil 直接比較,而不推薦使用 if let 語法。
// 推薦
if someOptional != nil {
// 你要做什麼
}
// 不推薦
if let _ = someOptional {
// 你要做什麼
}
在實現協議的時候,有兩種方式來組織你的代碼: 使用 // MARK: 注釋來分割協議實現和其他代碼。 使用 extension 在 類/結構體已有代碼外,但在同一個文件内。
使用 guard 語句 總體上,我們推薦使用提前返回的策略,而不是 if 語句的嵌套。使用 guard 語句可以改善代碼的可讀性。
// 推薦
func eatDoughnut(atIndex index: Int) {
guard index >= 0 && index < doughnuts else {
// 如果 index 超出允許範圍,提前返回。
return
}
let doughnut = doughnuts[index]
eat(doughnut)
}
// 不推薦
func eatDoughnuts(atIndex index: Int) {
if index >= 0 && index < donuts.count {
let doughnut = doughnuts[index]
eat(doughnut)
}
}
如果需要在2個狀态間做出選擇,建議使用if 語句,而不是使用 guard 語句。
// 推薦
if isFriendly {
print("你好, 遠路來的朋友!")
} else {
print(“窮小子,哪兒來的?")
}
// 不推薦
guard isFriendly else {
print("窮小子,哪兒來的?")
return
}
print("你好, 遠路來的朋友!")
文檔與注釋如果一個函數比較複雜,通常需要給函數添加注釋文檔。使用蘋果标準的方式進行注冊 option command /進行注釋 請務必查看在Apple文檔中描述的Swift的注釋标記中提供的全部功能。
指南:
1.160字符列限制
1.即使注釋隻占用一行,請使用/** */
1.不要再每一行附加一個*
1.确定使用新的 – parameter格式,而不是就得Use the new -:param:格式,另外注意 parameter 是小寫的。
class Human {
/**
This method feeds a certain food to a person.
- parameter food: The food you want to be eaten.
- parameter person: The person who should eat the food.
- returns: True if the food was eaten by the person; false otherwise.
*/
func feed(_ food: Food, to person: Human) -> Bool {
// ...
}
}
1.如果需要給一個方法的 參數/返回值/抛出異常 添加注釋,務必給所有的添加注釋,即使會看起來有部分重複,否則注釋會看起來不完整,有時候如果隻有一個參數值得添加注釋,可以在方法注釋裡重點描述。
1.對于複雜的類,可以使用一些潛在的例子來描述類的用法。請記住,Swift的注釋文檔中的markdown語法是有效的。換行符,列表等是适當的。
/**
## Feature Support
This class does some awesome things. It supports:
- Feature 1
- Feature 2
- Feature 3
## Examples
Here is an example use case indented by four spaces because that indicates a
code block:
let myAwesomeThing = MyAwesomeClass()
myAwesomeThing.makeMoney()
## Warnings
There are some things you should be careful of:
1. Thing one
2. Thing two
3. Thing three
*/
class MyAwesomeClass {
/* ... */
}
1.在寫文檔注釋時,盡量保持簡潔。當提到代碼時,使用 -
/ **
這樣做會有一個“UIViewController”,有時間。
- 警告:在運行此函數之前,請确保`someValue`為`true`。
* /
func myFunction() {
/ * ... * /
}
1.//後面要保留空格。
1.注釋必須要另起一行。
1.使用注釋 // MARK: - xoxo 時, 下面一行保留為空行。
class Pirate{
// MARK: - 實例屬性
private let pirateName : String
// MARK: - 初始化
init() {
/ * ... * /
}
}
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!