tft每日頭條

 > 科技

 > swift系統掃盲

swift系統掃盲

科技 更新时间:2025-02-01 01:56:54
命名
  • 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

    }

    }

    格式

    在團隊開發過程中,代碼格式非常重要,保持良好的代碼編寫習慣。

    • 每個文件結尾後又空白行。

    • 每一行都不能以空白作為結尾。

    swift系統掃盲(技術帖Swift代碼規範)1

    • 左邊的大括号不用另起一行。

    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每日頭條,我们将持续为您更新最新资讯!

    查看全部

    相关科技资讯推荐

    热门科技资讯推荐

    网友关注

    Copyright 2023-2025 - www.tftnews.com All Rights Reserved