Swift編碼規(guī)范

以下是一些常見的Swift編碼規(guī)范,可以幫助保持代碼一致性攒砖、可讀性和可維護(hù)性缸兔。

1. 命名規(guī)范

  • 類名、結(jié)構(gòu)體名吹艇、協(xié)議名:使用駝峰式命名(CamelCase)惰蜜,首字母大寫。例如:MyClass掐暮,UserProfile蝎抽。
  • 變量名、函數(shù)名路克、參數(shù)名:使用駝峰式命名(camelCase)樟结,首字母小寫。例如:userName精算,calculateArea()瓢宦。
  • 常量:使用駝峰式命名(camelCase),并且首字母小寫灰羽。例如:maximumNumberOfFiles驮履。

2. 代碼格式

  • 縮進(jìn):使用 4 個空格縮進(jìn),不要使用Tab廉嚼。
  • 括號:左括號與關(guān)鍵詞保持同一行玫镐,右括號單獨占一行。例如:
    if condition {
        // code
    }
    
  • 換行:每行代碼最多80-100個字符怠噪。超長的表達(dá)式應(yīng)在運算符前換行恐似。
  • 空格:在關(guān)鍵字和括號之間留一個空格,例如 if (condition)傍念,而在函數(shù)調(diào)用中不應(yīng)在函數(shù)名和左括號之間留空格矫夷,例如 calculateArea(width: 5)

3. 注釋

  • 使用//來寫單行注釋憋槐,使用/* ... */來寫多行注釋双藕。
  • 注釋應(yīng)該簡潔明了,解釋為什么做某些操作阳仔,而不是解釋“怎么做”忧陪。

4. 代碼組織

  • 屬性和方法的順序:通常將常量屬性放在最前面,變量屬性其次近范,然后是初始化方法(如構(gòu)造函數(shù))赤嚼,接著是其他方法。
  • 分組相關(guān)代碼:使用MARK:分隔符來分組相關(guān)功能的方法顺又。例如:
    // MARK: - Lifecycle Methods
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    

5. 使用Self關(guān)鍵字

  • 只有在必要時使用self關(guān)鍵字更卒,例如在閉包中捕獲self或參數(shù)名與屬性名沖突時。

6. 使用類型推斷

  • 能使用類型推斷時稚照,盡量讓編譯器推斷類型蹂空。避免冗長的類型聲明。例如:
    let name = "John"  // 而不是 let name: String = "John"
    

7. 錯誤處理

  • 使用guard語句來提前退出錯誤情況果录,減少嵌套上枕。
  • 使用do-catch來處理可能拋出錯誤的代碼。

8. Optionals

  • 使用if letguard let來安全解包optional值弱恒。
  • 使用??操作符提供默認(rèn)值辨萍,避免解包失敗。

9. 集合和字面量

  • 使用簡潔的字面量語法,例如[]表示空數(shù)組锈玉,[:]表示空字典爪飘。
  • 使用for-in循環(huán)來遍歷數(shù)組、字典或其他集合拉背。

10. 遵循協(xié)議的實現(xiàn)

  • 遵循協(xié)議的函數(shù)應(yīng)該盡量放在一個extension中师崎,使主類定義保持簡潔。

11. 訪問控制

  • 適當(dāng)使用private椅棺、fileprivate犁罩、internalpublicopen來控制屬性和方法的可見性两疚,默認(rèn)使用最低可見性床估。

12. 避免強(qiáng)制解包

  • 避免使用!來強(qiáng)制解包Optional變量,除非你明確知道它不會為nil诱渤。

13. 空數(shù)組和字典的初始化

  • 使用簡潔的初始化語法:
    var names = [String]()
    var scores = [String: Int]()
    

14. 避免全局變量

  • 除非必要丐巫,避免使用全局變量。盡量在類或結(jié)構(gòu)體內(nèi)定義屬性源哩。

15. 命名文件

  • 文件名應(yīng)與類鞋吉、結(jié)構(gòu)體或協(xié)議的名稱一致。

16. 使用 Final 關(guān)鍵字

  • 在類励烦、方法或?qū)傩郧凹由?code>final關(guān)鍵字谓着,防止它們被繼承或重寫,除非確實需要繼承行為坛掠。這樣可以提高性能并增加代碼的安全性赊锚。

17. 盡量使用 Swift 標(biāo)準(zhǔn)庫的功能

  • 使用Swift標(biāo)準(zhǔn)庫提供的功能而不是自己實現(xiàn)。例如屉栓,使用map舷蒲、filterreduce等高階函數(shù)來操作數(shù)組友多,而不是手動實現(xiàn)循環(huán)牲平。

18. 避免過度使用嵌套

  • 復(fù)雜的嵌套結(jié)構(gòu)會使代碼難以理解。使用guard語句域滥、早返回纵柿、分解函數(shù)和邏輯來減少嵌套層級。

19. 處理返回值

  • 如果函數(shù)有返回值启绰,在需要的情況下捕獲和使用它們昂儒。避免調(diào)用函數(shù)但忽略其返回值的情況。

20. 內(nèi)存管理

  • 小心處理強(qiáng)引用循環(huán)委可,特別是在閉包中使用[weak self][unowned self]來避免強(qiáng)引用循環(huán)渊跋。
  • 理解ARC(自動引用計數(shù))的工作原理,確保對象在不需要時被釋放。

21. 使用Enums而不是Magic Numbers

  • 使用enum代替硬編碼的常量或“魔法數(shù)字”拾酝。這樣可以使代碼更具可讀性和可維護(hù)性燕少。
enum UserType {
    case admin
    case regular
    case guest
}

22. 遵循 SOLID 原則

  • 盡量遵循面向?qū)ο笤O(shè)計的SOLID原則:單一職責(zé)原則、開閉原則微宝、里氏替換原則棺亭、接口分離原則和依賴反轉(zhuǎn)原則虎眨。這有助于使代碼模塊化蟋软、可擴(kuò)展和易于維護(hù)。

23. 避免過長的函數(shù)

  • 函數(shù)應(yīng)盡量短小嗽桩,只執(zhí)行單一職責(zé)岳守。如果函數(shù)過長,考慮將其拆分為多個函數(shù)碌冶。

24. 使用合適的集合類型

  • 根據(jù)需求選擇合適的集合類型(如Array湿痢、SetDictionary)扑庞。例如譬重,如果不需要元素順序且需要唯一性,使用Set罐氨。

25. 使用字符串插值而非拼接

  • 使用字符串插值"\(variable)"而不是使用+運算符來拼接字符串臀规,這樣更簡潔和高效。

26. 處理可選值時使用 Nil-Coalescing 操作符

  • 使用??提供默認(rèn)值栅隐,以便在可選值為nil時使用默認(rèn)值塔嬉。
let value = optionalValue ?? "default value"

27. 類型別名

  • 當(dāng)類型復(fù)雜且多次使用時,使用typealias為類型創(chuàng)建別名租悄,增加代碼可讀性谨究。
typealias CompletionHandler = (Result<Data, Error>) -> Void

28. Documentation(文檔注釋)

  • 使用///語法為公共API、類泣棋、方法和屬性編寫文檔注釋胶哲,以便生成文檔并幫助其他開發(fā)人員理解代碼。
/// 計算矩形的面積
/// - Parameters:
///   - width: 矩形的寬度
///   - height: 矩形的高度
/// - Returns: 矩形的面積
func calculateArea(width: Double, height: Double) -> Double {
    return width * height
}

29. 避免大塊的代碼注釋

  • 如果某些代碼不再使用潭辈,考慮刪除而不是注釋掉鸯屿。版本控制系統(tǒng)如Git可以幫助跟蹤代碼的歷史。

30. 定義初始化方法

  • 自定義的初始化方法應(yīng)確保所有屬性都被正確初始化萎胰。使用convenience initrequired init根據(jù)需要定義多種初始化方式碾盟。

31. 盡量避免使用全局函數(shù)

  • 盡量避免使用全局函數(shù),除非這些函數(shù)與具體類型無關(guān)技竟。使用靜態(tài)方法或擴(kuò)展來組織代碼冰肴。

32. 類與結(jié)構(gòu)體的選擇

  • 使用結(jié)構(gòu)體(struct)而非類(class),當(dāng)數(shù)據(jù)是值類型且不會被繼承時。結(jié)構(gòu)體是默認(rèn)不可變的熙尉,可以減少錯誤联逻。

33. 保持一致性

  • 保持代碼風(fēng)格的一致性。團(tuán)隊成員之間應(yīng)采用統(tǒng)一的編碼風(fēng)格检痰,以便不同的人可以輕松理解和維護(hù)代碼包归。

34. 自動化工具和Linting

  • 使用工具如SwiftLint來自動檢查代碼風(fēng)格一致性和潛在錯誤。自動化工具可以幫助發(fā)現(xiàn)并遵循規(guī)范铅歼。

35. 性能優(yōu)化

  • 使用lazy關(guān)鍵字延遲初始化公壤,減少不必要的性能開銷。
  • 只在必要時使用@escaping關(guān)鍵字來避免閉包導(dǎo)致的引用循環(huán)椎椰。

36. 保持接口簡單

  • 盡量保持函數(shù)和方法的參數(shù)數(shù)量少于5個厦幅。過多的參數(shù)會增加函數(shù)的復(fù)雜性和使用難度五督∽婪郏可以考慮使用結(jié)構(gòu)體來傳遞多個參數(shù)济丘。

37. 使用可變參數(shù) (Variadic Parameters)

  • 當(dāng)需要傳遞可變數(shù)量的相同類型參數(shù)時瘟斜,使用可變參數(shù)本砰。例如坏瘩,定義一個函數(shù)可以接受多個字符串:
func logMessages(_ messages: String...) {
    for message in messages {
        print(message)
    }
}

38. 避免使用 Any 和 AnyObject

  • 盡量避免使用AnyAnyObject介牙,除非絕對必要银受。明確的類型更容易理解和調(diào)試圈膏,使用泛型來保持類型安全塔猾。

39. 延遲屬性初始化

  • 使用lazy關(guān)鍵字來延遲初始化那些可能在對象生命周期中不一定會用到的屬性,從而提高性能:
lazy var expensiveObject: ExpensiveObject = {
    // 初始化代碼
    return ExpensiveObject()
}()

40. 使用 defer 語句

  • 使用defer語句來確保在函數(shù)或方法退出前執(zhí)行特定的清理操作本辐,如關(guān)閉文件或釋放資源桥帆。這在資源管理或處理錯誤時非常有用。
func readFile() {
    let file = openFile()
    defer {
        closeFile(file)
    }
    // 文件處理代碼
}

41. 盡量避免強(qiáng)制類型轉(zhuǎn)換 (Forced Casting)

  • 強(qiáng)制類型轉(zhuǎn)換使用as!是不安全的慎皱,可能導(dǎo)致運行時崩潰老虫。使用可選綁定(as?)或條件類型檢查(if let)來處理轉(zhuǎn)換。

42. 避免使用魔術(shù)字符串 (Magic Strings)

  • 不要在代碼中直接使用字符串字面量作為標(biāo)識符茫多、鍵名或配置選項祈匙。使用常量或枚舉來定義這些值,以減少拼寫錯誤和維護(hù)難度天揖。

43. 使用閉包簡寫語法

  • 當(dāng)閉包參數(shù)名稱沒有歧義時夺欲,使用Swift的閉包簡寫語法來使代碼更簡潔:
let sortedNames = names.sorted { $0 > $1 }

44. 測試和單元測試

  • 編寫單元測試來驗證代碼的正確性。使用XCTest框架來編寫和運行測試今膊。確保覆蓋關(guān)鍵路徑和邊界情況些阅。

45. 優(yōu)化UI代碼

  • 使用DispatchQueue.main.async確保UI更新在主線程上進(jìn)行。
  • 在重繪和布局變化頻繁的地方斑唬,如tableViewcollectionView的cell中市埋,避免復(fù)雜的計算或數(shù)據(jù)處理黎泣。

46. 使用 Functional Programming Paradigms

  • 盡量使用Swift的函數(shù)式編程功能,如map缤谎、filter抒倚、reduce,而不是傳統(tǒng)的循環(huán)坷澡。這可以使代碼更簡潔并減少錯誤托呕。

47. 在對象創(chuàng)建時使用構(gòu)造函數(shù)依賴注入

  • 通過構(gòu)造函數(shù)傳遞依賴項而不是使用全局單例或依賴查找。這可以使對象更容易測試和復(fù)用频敛。
class ViewController: UIViewController {
    private let dataService: DataService

    init(dataService: DataService) {
        self.dataService = dataService
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

48. 使用guard提高代碼可讀性

  • guard語句比if更適合用于條件提前退出项郊,避免深度嵌套,并使代碼更扁平化和易讀姻政。
func process(value: Int?) {
    guard let value = value else {
        return
    }
    // 使用 value 進(jìn)行處理
}

49. 處理異步代碼時使用 Task 和 await

  • Swift 5.5 引入了并發(fā)功能呆抑。使用async/await處理異步操作岂嗓,這比傳統(tǒng)的回調(diào)和閉包更易于理解和管理汁展。
func fetchData() async throws -> Data {
    let data = try await URLSession.shared.data(from: url)
    return data
}

50. 使用擴(kuò)展 (Extensions)

  • 使用擴(kuò)展將相關(guān)的功能或特性分組,使代碼更有組織性厌殉。將協(xié)議實現(xiàn)和特定功能分離到各自的擴(kuò)展中食绿。
extension User {
    func fullName() -> String {
        return "\(firstName) \(lastName)"
    }
}

51. 使用自定義操作符時保持謹(jǐn)慎

  • 自定義操作符可能會使代碼更簡潔,但過度使用或命名不清晰可能導(dǎo)致混淆公罕。確保它們有明確的含義并與標(biāo)準(zhǔn)操作符一致器紧。

52. 考慮可讀性和維護(hù)性

  • 在代碼優(yōu)化和簡化時,始終優(yōu)先考慮可讀性楼眷。寫給其他開發(fā)者看的代碼應(yīng)該是清晰和易于理解的铲汪。

53. 正確處理 UI 狀態(tài)

  • 避免直接操作 UI 組件的狀態(tài),特別是在多線程環(huán)境中罐柳。使用專門的狀態(tài)管理工具或模式(如Redux掌腰、MVVM)來管理狀態(tài)和視圖更新。

54. 合理使用數(shù)據(jù)封裝和隱私

  • 盡量將屬性和方法設(shè)為privatefileprivate张吉,只有在需要時才暴露為internalpublic齿梁。這有助于防止對象被意外修改。

55. 避免過度優(yōu)化

  • 先讓代碼可讀和工作正常肮蛹,然后根據(jù)性能需求進(jìn)行優(yōu)化勺择。過早的優(yōu)化可能會增加復(fù)雜性并難以維護(hù)。

56. 使用訪問控制明確表達(dá)意圖

  • 訪問控制不僅僅是為了安全性伦忠,它也表達(dá)了類省核、屬性或方法的意圖。使用private昆码、fileprivate气忠、internal邓深、publicopen來明確哪些部分應(yīng)該被訪問或繼承笔刹。

57. 使用typealias簡化復(fù)雜類型

  • 當(dāng)使用復(fù)雜類型時芥备,例如閉包或元組,使用typealias可以提高可讀性和易用性舌菜。
typealias CompletionHandler = (Result<Data, Error>) -> Void

58. 適當(dāng)使用deinit進(jìn)行清理

  • 在類中實現(xiàn)deinit方法萌壳,用于釋放資源或進(jìn)行必要的清理操作,避免內(nèi)存泄漏或其他資源問題日月。

59. 避免無用的代碼

  • 定期清理不再使用的代碼袱瓮、變量、函數(shù)和文件爱咬。保持代碼庫的簡潔和整潔尺借,有助于提高項目的可維護(hù)性。

60. 合理使用@available#available檢查系統(tǒng)版本

  • 在處理不同iOS版本兼容性時精拟,使用@available注解和#available語句來檢查API的可用性燎斩。
if #available(iOS 15, *) {
    // 使用 iOS 15 的新特性
} else {
    // 使用兼容版本的實現(xiàn)
}

61. 使用@discardableResult修飾符

  • 如果函數(shù)返回值不一定需要處理,但你仍希望函數(shù)有返回值蜂绎,可以使用@discardableResult來標(biāo)記栅表,以避免編譯器警告。
@discardableResult
func performTask() -> Bool {
    // 執(zhí)行任務(wù)
    return true
}

62. 避免使用嵌套的guardif語句

  • 當(dāng)使用guardif語句時师枣,盡量避免嵌套怪瓶。過多的嵌套會使代碼難以閱讀和理解。使用早退出的方式可以簡化邏輯践美。

63. 避免過度使用單例模式

  • 雖然單例模式有其用途洗贰,但過度使用會增加代碼的耦合性和測試的難度。只在需要全局共享狀態(tài)時使用單例陨倡。

64. 在適當(dāng)時使用@frozen關(guān)鍵字

  • 對于不希望在未來擴(kuò)展或修改的enumstruct使用@frozen關(guān)鍵字敛滋。這能提高優(yōu)化和性能。
@frozen
enum Direction {
    case north
    case south
    case east
    case west
}

65. 遵循命令查詢分離原則 (Command Query Separation, CQS)

  • 將命令(改變狀態(tài)的方法)與查詢(返回信息的方法)分離玫膀。一個方法要么是做事(有副作用)矛缨,要么是返回值(無副作用),而不是兩者都做帖旨。

66. 正確處理多線程

  • 使用GCD(Grand Central Dispatch)和OperationQueue來管理多線程操作箕昭。確保UI更新總是在主線程上進(jìn)行,并避免數(shù)據(jù)競爭和死鎖解阅。

67. 使用map落竹、flatMapcompactMap货抄、reduce等函數(shù)

  • 這些函數(shù)可以使集合操作更簡潔和表達(dá)力更強(qiáng)述召。例如朱转,將一個可選數(shù)組中的所有非nil值提取出來:
let numbers: [Int?] = [1, 2, nil, 4, nil]
let nonNilNumbers = numbers.compactMap { $0 }

68. 盡量避免在init方法中調(diào)用方法

  • 調(diào)用子類或自身的可被重寫的方法可能導(dǎo)致未定義的行為,因為對象可能尚未完全初始化积暖。

69. 使用協(xié)議而不是繼承

  • 如果不需要共享具體實現(xiàn)細(xì)節(jié)藤为,使用協(xié)議來定義接口而不是繼承。這樣可以減少耦合夺刑,提高靈活性和復(fù)用性缅疟。

70. 在擴(kuò)展中實現(xiàn)協(xié)議

  • 將協(xié)議的實現(xiàn)放在擴(kuò)展中,而不是在類定義中遍愿,這可以保持類定義的簡潔和清晰存淫。
class User: Codable {
    var name: String
}

extension User: CustomStringConvertible {
    var description: String {
        return "User(name: \(name))"
    }
}

71. 對大數(shù)組或集合的操作使用懶序列

  • 使用lazy屬性來實現(xiàn)延遲求值,有助于提高性能沼填,尤其是在處理大型集合時桅咆。
let largeArray = Array(1...1000).lazy.filter { $0 % 2 == 0 }.map { $0 * 2 }

72. 處理defer中的錯誤

  • defer語句塊中處理可能的錯誤情況,這樣可以確保在方法退出前執(zhí)行必要的清理操作坞笙,即使出現(xiàn)了錯誤岩饼。
func processFile() {
    let file = openFile()
    defer {
        closeFile(file)
    }
    // 其他文件操作
}

73. 避免不必要的可變狀態(tài)

  • 盡量使用let而不是var,減少狀態(tài)的可變性羞海。這有助于代碼更加穩(wěn)定和可靠忌愚。

74. 合理使用default分支

  • 在處理enum或其他明確類型時,盡量避免使用default分支却邓,而是明確列出每種情況,以便在新增類型時可以發(fā)現(xiàn)編譯錯誤院水。

75. 使用#warning#error標(biāo)簽標(biāo)記待辦事項

  • 使用#warning("To-Do: refactor this method")來標(biāo)記需要進(jìn)一步改進(jìn)的代碼腊徙,以提醒開發(fā)者后續(xù)處理。

76. 多使用Swift內(nèi)建的調(diào)試工具

  • 善用Xcode的調(diào)試工具檬某、儀器(Instruments)撬腾、性能分析工具(如Time Profiler)來監(jiān)控和優(yōu)化代碼。

77. 使用@objc時的注意事項

  • 僅在需要與Objective-C互操作時使用@objc恢恼,這將影響性能并增加復(fù)雜性民傻。

78. 避免魔法方法

  • 不要過度依賴于特殊命名的魔法方法,例如viewDidLoad场斑、viewWillAppear漓踢。雖然它們在特定框架中有特定意義,但過度使用或在自定義類中定義類似方法可能會導(dǎo)致混淆漏隐。

79. 優(yōu)化內(nèi)存使用

  • 使用弱引用(weak)或無主引用(unowned)來避免強(qiáng)引用循環(huán)喧半,特別是在視圖控制器和其視圖模型之間。

80. 使用自定義日志功能

  • 使用自定義日志方法或框架來替代print青责,這樣可以更好地控制日志級別(如Debug挺据、Info取具、Warning、Error)并更方便地在生產(chǎn)環(huán)境中啟用或禁用日志扁耐。

總結(jié)

這些附加的Swift編碼規(guī)范和最佳實踐幫助提升代碼的安全性暇检、可維護(hù)性和性能。遵循這些準(zhǔn)則可以使代碼更加清晰婉称、易讀占哟、易于調(diào)試,并減少潛在的錯誤風(fēng)險酿矢。在項目開發(fā)中榨乎,始終保持良好的編碼習(xí)慣不僅能夠提高代碼質(zhì)量,還能促進(jìn)團(tuán)隊協(xié)作和項目的長期可持續(xù)性瘫筐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜜暑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子策肝,更是在濱河造成了極大的恐慌肛捍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件之众,死亡現(xiàn)場離奇詭異拙毫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)棺禾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門缀蹄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膘婶,你說我怎么就攤上這事缺前。” “怎么了悬襟?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵衅码,是天一觀的道長。 經(jīng)常有香客問我脊岳,道長逝段,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任割捅,我火速辦了婚禮奶躯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棺牧。我一直安慰自己巫糙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布颊乘。 她就那樣靜靜地躺著参淹,像睡著了一般醉锄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浙值,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天恳不,我揣著相機(jī)與錄音,去河邊找鬼开呐。 笑死烟勋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筐付。 我是一名探鬼主播卵惦,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓦戚!你這毒婦竟也來了沮尿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤较解,失蹤者是張志新(化名)和其女友劉穎畜疾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體印衔,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡啡捶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奸焙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞎暑。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忿偷,靈堂內(nèi)的尸體忽然破棺而出金顿,到底是詐尸還是另有隱情,我是刑警寧澤鲤桥,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站渠概,受9級特大地震影響茶凳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜播揪,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一贮喧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猪狈,春花似錦箱沦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灶伊。三九已至,卻和暖如春寒跳,著一層夾襖步出監(jiān)牢的瞬間聘萨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工童太, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留米辐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓书释,卻偏偏與公主長得像翘贮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子爆惧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 溫德里奇規(guī)范 本規(guī)范原文鏈接. 規(guī)范只是一些最佳實踐, 請酌情使用. 1 正確性 第一條原則, 也是最根本的原則:...
    貘鳴閱讀 1,564評論 1 0
  • Swift 編碼規(guī)范 基本原則 參考資料 通用規(guī)則 格式 命名 編碼風(fēng)格 訪問修飾符 Enum Optional ...
    wsj_2012閱讀 1,956評論 0 4
  • 翻譯作者:碼農(nóng)網(wǎng) – 豆照建 沒事多看看狸页,規(guī)范一下swift 編碼習(xí)慣。 1. 代碼格式 1.1 使用四個空格進(jìn)行...
    彡廿閱讀 836評論 0 2
  • 官方 Swift 風(fēng)格指南 一定要閱讀Apple 的 API 設(shè)計規(guī)范检激。 具體的規(guī)范細(xì)節(jié)和附加說明如下肴捉。 本指南已...
    蘋果上的小豌豆閱讀 710評論 0 1
  • 注:以下皆為翻譯,如有錯誤或疏漏叔收,請指正齿穗。謝謝? 簡介 (raywenderlich 版)您看到的這份規(guī)范可能與其...
    LovelyYilia閱讀 4,355評論 1 17