中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Swift編程規(guī)范:保持代碼優(yōu)美的10個方法

2018-07-20    來源:編程學習網(wǎng)

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

  這篇Swift風格指南與你看到的其他的指南有所不同,此篇指南主要焦點集中在打印和Web展示的可讀寫上。我們創(chuàng)建此篇風格指南的目的,是為了讓我們的圖書、教程以及初學者套件中的代碼保持優(yōu)美和一致,即使我們有很多不同的作者共同編寫這些圖書。

  我們的首要目標是一致性,可讀性和簡潔性。

  還在使用Objective-C?也可以參考我們的Objective-C風格指南(中譯版)。

 命名(Naming)

  使用駝峰式的描述性命名方式,為類,方法,變量等命名。類名的首字母應該大寫,而方法和變量的首字母使用小寫字符。

  推薦做法:

private let maximumWidgetCount = 100
class WidgetContainer {
  var widgetButton: UIButton
  let widgetHeightPercentage = 0.85
}

  不推薦做法:

let MAX_WIDGET_COUNT = 100
class app_widgetContainer {
  var wBut: UIButton
  let wHeightPct = 0.85
}

  對于函數(shù)和初始化方法,推薦對所有的參數(shù)進行有意義的命名,除非上下文已經(jīng)非常清楚。如果外部參數(shù)命名可以使得函數(shù)調(diào)用更加可讀,也應該把外部參數(shù)命名包含在內(nèi)。

func dateFromString(dateString: String) -> NSDate
func convertPointAt(#column: Int, #row: Int) -> CGPoint
func timedAction(#delay: NSTimeInterval, perform action: SKAction) -> SKAction!
// 調(diào)用方式如下:
dateFromString("2014-03-14")
convertPointAt(column: 42, row: 13)
timedAction(delay: 1.0, perform: someOtherAction)

  對于方法來說,參照標準的蘋果慣例,方法命名含義要引用到第一個參數(shù):

class Guideline {
  func combineWithString(incoming: String, options: Dictionary?) { ... }
  func upvoteBy(amount: Int) { ... }
}

 枚舉(Enumerations)

  使用首字母大寫的駝峰命名規(guī)則來命名枚舉值:

enum Shape {
  case Rectangle
  case Square
  case Triangle
  case Circle
}

 文章(Prose)

  當我們在文章中(教程,圖書,注釋等)需要引用到函數(shù)時,需要從調(diào)用者的視角考慮,包含必要的參數(shù)命名,或者使用_表示不需要命名的參數(shù)。

從你自身實現(xiàn)的init中調(diào)用convertPointAt(column:row:)。
如果你調(diào)用dateFromString(_:),需要保證你提供的輸入字符串格式是”yyyy-MM-dd”。
如果你需要在viewDidLoad()中調(diào)用timedAction(delay:perform:),記得提供調(diào)整后的延遲值和需要處理的動作。
你不能直接調(diào)用數(shù)據(jù)源方法tableView(_:cellForRowAtIndexPath:)

  當你遇到疑問時,可以看看Xcode在jump bar中是如何列出方法名的 —— 我們的風格與此匹配。

 類的前綴(Class Prefixes)

  Swift類型自動被模塊名設置了名稱空間,所以你不需要加一個類的前綴。如果兩個來自不同模塊的命名沖突了,你可以附加一個模塊名到類型命名的前面來消除沖突。

import SomeModule  

let myClass = MyModule.UsefulClass()

 空格(Spacing)

  • 使用2個空格的縮進比使用tabs更好,可以減少占用空間和幫助防止多次換行。確保在Xcode進行了下圖的偏好設置:

 

  • 方法定義的大括號或者其他大括號(if/else/switch/while等)—— 般都放在定義名稱的同一行,并且使用一個新的行來結束。
  • 提示:你可以通過以下方法重新進行縮進:選擇一些代碼(或者使用?A選擇所有),然后按Control-I(或者點擊菜單欄 Editor\Structure\Re-Indent)。一些Xcode模板代碼使用的縮進是4個空格,所以這種方法可以很好的修復縮進。

  推薦做法:

if user.isHappy {
  // Do something
} else {
  // Do something else
}

  不推薦做法:

if user.isHappy
{
    // Do something
}
else {
    // Do something else
}
  • 應該在方法之間空出一行,從視覺上有更好的區(qū)分和組織。方法內(nèi)的空白行隔開不同的功能,但是當一個方法中有很多段落時,也意味著你應該將該方法重構成幾個方法。

 注釋(Comments)

  當你需要時,使用注釋來解釋一段特定的代碼段的作用。注釋必須保證更新或者及時刪除。

  避免在代碼中使用塊注釋,代碼盡可能自己能表達含義。以下情況除外:當使用注釋來生成文檔時。

 類和結構體(Classes and Structures)

 選擇使用誰?(Which one to use?)

  請記住,結構體是值類型。使用結構體并沒有一個標識。一個數(shù)組包含[a, b, c]和另外一個數(shù)組同樣包含[a, b, c]是完全一樣的,它們完全可以交換使用。使用第一個還是使用第二個無關緊要,因為它們代表的是同一個東西。這就是為什么數(shù)組是結構體。

  類是引用類型。使用類是有一個標識或者有一個特定的生命周期。你需要對一個人類建模為一個類,因為兩個不同的人的實例,是兩個不同的東西。只是因為兩個人有同樣的名字和生日,也不能斷定這兩個人是一樣的。但是人的生日是一個結構體,因為日期1950-3-3和另外一個日期1950-3-3是相同的。日期不需要一個標識。

  有時,一些事物應該定義為結構體,但是需要兼容AnyObject或者已經(jīng)在以前的歷史版本中定義為類(NSDate,NSSet)。盡可能的嘗試遵守這些規(guī)則。

 定義的案例(Example definition)

  以下是一個風格很好的類定義:

class Circle: Shape {
  var x: Int, y: Int
  var radius: Double
  var diameter: Double {
    get {
      return radius * 2
    }
    set {
      radius = newValue / 2
    }
  }
  init(x: Int, y: Int, radius: Double) {
    self.x = x
    self.y = y
    self.radius = radius
  }
  convenience init(x: Int, y: Int, diameter: Double) {
    self.init(x: x, y: y, radius: diameter / 2)
  }
  func describe() -> String {
    return "I am a circle at \(centerString()) with an area of \(computeArea())"
  }
  override func computeArea() -> Double {
    return M_PI * radius * radius
  }
  private func centerString() -> String {
    return "(\(x),\(y))"
  }
}

  以上例子遵循了以下風格規(guī)范:

  • 指定屬性、變量、常量、參數(shù)定義或者其他定義的類型,在冒號后面,緊跟著一個空格,而不是把空格放在冒號前面。比如:x: Int和Circle: Shape。
  • 如果能表示相同的目的和上下文,可以在同一行定義多個變量和結構體。
  • 縮進getter,setter的定義和屬性觀察器的定義。
  • 不需要添加internal這樣的默認的修飾符。同樣的,不需要在重寫一個方法時添加訪問修飾符。

 Self的使用(Use of Self)

  為了保持簡潔,避免使用 self 關鍵詞,Swift 不需要使用 self 來訪問對象屬性和調(diào)用對象方法。

  必須使用 self 來區(qū)分構造器中屬性命名和參數(shù)命名,還有在閉包表達式中引用屬性值(編譯器需要區(qū)分):

class BoardLocation {
  let row: Int, column: Int
  init(row: Int, column: Int) {
    self.row = row
    self.column = column
    let closure = {
      println(self.row)
    }
  }
}

 協(xié)議遵守(Protocol Conformance)

  當我們對一個類添加協(xié)議時,推薦使用一個單獨的類擴展來實現(xiàn)協(xié)議的方法。這可以保持協(xié)議相關的方法聚合在一起,同時也可以簡單的標識出一個協(xié)議對應類中需要實現(xiàn)哪些對應的方法。

  同時,別忘了添加// MARK:,注釋可以使得代碼組織的更好!

  推薦做法:

class MyViewcontroller: UIViewController {
  // class stuff here
}
// MARK: - UITableViewDataSource
extension MyViewcontroller: UITableViewDataSource {
  // table view data source methods
}
// MARK: - UIScrollViewDelegate
extension MyViewcontroller: UIScrollViewDelegate {
 // scroll view delegate methods
}

  不推薦做法:

class MyViewcontroller: UIViewController, UITableViewDataSource, UIScrollViewDelegate {
  // all methods
}

 計算屬性(Computed Properties)

  為了保持簡潔,如果一個計算屬性是只讀的,請忽略掉get語句。只有在需要定義set語句的時候,才提供get語句。

  推薦做法:

var diameter: Double {
  return radius * 2
}

  不推薦做法:

var diameter: Double {  
  get {  
    return radius * 2  
  }  
}  

 函數(shù)聲明(Function Declarations)

  保證短的函數(shù)定義在同一行中,并且包含左大括號:

func reticulateSplines(spline: [Double]) -> Bool {
  // reticulate code goes here
}

  在一個長的函數(shù)定義時,在適當?shù)牡胤竭M行換行,同時在下一行中添加一個額外的縮進:

func reticulateSplines(spline: [Double], adjustmentFactor: Double,
    translateConstant: Int, comment: String) -> Bool {
  // reticulate code goes here
}

 閉包表達式(Closure Expressions)

  如果閉包表達式參數(shù)在參數(shù)列表中的最后一個時,使用尾部閉包表達式。給定閉包參數(shù)一個描述性的命名。

  推薦做法:

UIView.animateWithDuration(1.0) {
  self.myView.alpha = 0
}
UIView.animateWithDuration(1.0,
  animations: {
    self.myView.alpha = 0
  },
  completion: { finished in
    self.myView.removeFromSuperview()
  }
)

  不推薦做法:

UIView.animateWithDuration(1.0, animations: {
  self.myView.alpha = 0
})
UIView.animateWithDuration(1.0,
  animations: {
    self.myView.alpha = 0
  }) { f in
    self.myView.removeFromSuperview()
}

  當單個閉包表達式上下文清晰時,使用隱式的返回值:

attendeeList.sort { a, b in
  a > b
}

 類型(Types)

  盡可能使用 Swift 原生類型。Swift 提供到 Objective-C 類型的橋接,所以你仍然可以使用許多需要的方法。

  推薦做法:

let width = 120.0                                    // Double
let widthString = (width as NSNumber).stringValue    // String

  不推薦做法:

let width: NSNumber = 120.0                          // NSNumber
let widthString: NSString = width.stringValue        // NSString

  在Sprite Kit代碼中,使用CGFloat可以使得代碼更加簡明,避免很多轉(zhuǎn)換。

 常量(Constants)

  常量定義使用 let 關鍵字,變量定義使用 var 關鍵字,如果變量的值不需要改變,請盡量使用 let 關鍵字。

  提示:一個好的技巧是,使用 let 定義任何東西,只有在編譯器告訴我們值需要改變的時候才改成 var 定義。

 可選類型(Optionals)

  當nil值是可以接受的時候時,定義變量和函數(shù)返回值為可選類型(?)。

  當你確認變量在使用前已經(jīng)被初始化時,使用!來顯式的拆包類型,比如在viewDidLoad中會初始化subviews。

  當你訪問一個可選值時,如果只需要訪問一次或者在可選值鏈中有多個可選值時,請使用可選值鏈:

self.textContainer?.textLabel?.setNeedsDisplay()

  當需要很方便的一次性拆包或者添加附加的操作時,請使用可選值綁定:

if let textContainer = self.textContainer {
  // do many things with textContainer
}

  當我們命名一個可選變量和屬性時,避免使用諸如optionalString和maybeView這樣的命名,因為可選值的表達已經(jīng)在類型定義中了。

  在可選值綁定中,直接映射原始的命名比使用諸如unwrappedView和actualLabel要好。

  推薦做法:

var subview: UIView?
var volume: Double?
// later on...
if let subview = subview, volume = volume {
  // do something with unwrapped subview and volume
}

  不推薦做法:

var optionalSubview: UIView?
var volume: Double?
if let unwrappedSubview = optionalSubview {
  if let realVolume = volume {
    // do something with unwrappedSubview and realVolume
  }
}

 結構體構造器(Struct Initializers)

  使用原生的 Swift 結構體構造器,比老式的幾何類(CGGeometry)的構造器要好。

  推薦做法:

let bounds = CGRect(x: 40, y: 20, width: 120, height: 80)
let centerPoint = CGPoint(x: 96, y: 42)

  不推薦做法:

let bounds = CGRectMake(40, 20, 120, 80)
let centerPoint = CGPointMake(96, 42)

  推薦使用結構體限定的常量CGRect.infiniteRect,CGRect.nullRect等,來替代全局常量CGRectInfinite,CGRectNull等。對于已經(jīng)存在的變量,可以直接簡寫成 .zeroRect。

 類型推斷(Type Inference)

  推薦使用更加緊湊的代碼,讓編譯器能夠推斷出常量和變量的類型。除非你需要定義一個特定的類型(比如CGFloat和Int16),而不是默認的類型。

  推薦做法:

let message = "Click the button"
let currentBounds = computeViewBounds()
var names = [String]()
let maximumWidth: CGFloat = 106.5

  不推薦做法:

let message: String = "Click the button"
let currentBounds: CGRect = computeViewBounds()
var names: [String] = []

  注意:遵守這條規(guī)則意味選擇描述性命名比之前變得更加重要。

 語法糖(Syntactic Sugar)

  推薦使用類型定義簡潔的版本,而不是全稱通用語法。

  推薦做法:

var deviceModels: [String]
var employees: [Int: String]
var faxNumber: Int?

  不推薦做法:

var deviceModels: Array<String>
var employees: Dictionary<Int, String>
var faxNumber: Optional<Int>

 控制流(Control Flow)

  推薦循環(huán)使用for-in表達式,而不使用for-condition-increment表達式。

  推薦做法:

for _ in 0..<3 {
  println("Hello three times")
}
for (index, person) in enumerate(attendeeList) {
  println("\(person) is at position #\(index)")
}

 不推薦做法:

for var i = 0; i < 3; i++ {  
  println("Hello three times")  
}  
for var i = 0; i < attendeeList.count; i++ {  
  let person = attendeeList[i]  
  println("\(person) is at position #\(i)")  
}  

 分號(Semicolons)

  Swift不需要在你代碼中的每一句表達式之后添加分號。只有在你需要在一行中連接多個表達式中,使用分號來區(qū)隔。

  不要在同一行編寫多個使用分號區(qū)隔的表達式。

  唯一的例外是在使用for-conditional-increment 架構。然而,盡可能使用for-in架構來替代它。

  推薦做法:

let swift = "not a scripting language"

  不推薦做法: 

let swift = "not a scripting language";

  注意:Swift與JavaScript有很大的不同,JavaScript認為忽略分號通常認為是不安全的。

 語言(Language)

  使用美式英語拼音符合Apple API的標準。

  推薦做法:

let color = "red"

  不推薦做法:

let colour = "red"

 版權聲明(Copyright Statement)

  以下的版權聲明應該被包含在所有源文件的頂部:

/*
 * Copyright (c) 2015 Razeware LLC
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

  笑臉(Smiley Face)

  笑臉是raywenderlich.com網(wǎng)站非常重要的風格特性!擁有一個正確的笑臉,表達代碼文章中開心和激動,是非常重要的。使用]來代表笑臉,因為這代表ASCII中最大的笑臉。)只能創(chuàng)建半個心型笑臉,所以不推薦使用。

  推薦做法:

:]

  不推薦做法:

:)

 作者(Credits)

  這篇風格指南是所有raywenderlich.com團隊成員共同的努力:

  • Jawwad Ahmad
  • Soheil Moayedi Azarpour
  • Scott Berrevoets
  • Eric Cerney
  • Sam Davies
  • Evan Dekhayser
  • Jean-Pierre Distler
  • Colin Eberhardt
  • Greg Heo
  • Matthijs Hollemans
  • Erik Kerber
  • Christopher LaPollo
  • Ben Morrow
  • Andy Pereira
  • Ryan Nystrom
  • Cesare Rocchi
  • Ellen Shapiro
  • Marin Todorov
  • Chris Wagner
  • Ray Wenderlich
  • Jack Wu

  向Nicholas Waynik和Objective-C Style Guide團隊脫帽致敬。

  我們同時也從蘋果的官方Swift資料中尋找靈感:

  • The Swift Programming Language
  • Using Swift with Cocoa and Objective-C
  • Swift Standard Library Reference

  本文出自:The Official raywenderlich.com Swift Style Guide,譯文出自:SwiftGG

標簽: isp 安全 代碼

版權申明:本站文章部分自網(wǎng)絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:10個實用的但偏執(zhí)的Java編程技術

下一篇:每個Android開發(fā)者應該知道的6個SDK和API