Swift开发

Swift 代码规范

2020-03-16  本文已影响0人  CarsonChen

Swift,苹果于2014年WWDC苹果开发者大会发布的新开发语言,可与Objective-C共同运行于macOS和iOS平台,用于搭建基于苹果平台的应用程序。
Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。Swift的设计以安全为出发点,以避免各种常见的编程错误类别。
2015年12月4日,苹果公司宣布其Swift编程语言开放源代码。长600多页的The Swift Programming Language 可以在线免费下载。

一. 命名

  1. 类型
enum GenderType {
    
    case male
    case female
}

struct Person {
    
    var gender: GenderType?
}

  1. 协议

  1. 类前缀
import ToolsModule 
let myClass = ToolsModule.UsefulClass()

  1. 参数命名

正确代码:

func namePickerView(_ namePickerView: NamePickerView, didSelectName name: String)
func namePickerViewShouldReload(_ namePickerView: NamePickerView) -> Bool

错误代码:

func didSelectName(namePicker: NamePickerViewController, name: String)
func namePickerShouldReload() -> Bool

正确代码:

struct Stack<Element>{ ... }
func writeTo <Target: OutputStream>(to Target: inout Target)
func swap(_ a: inout T, _ b: inout T) 

错误代码:

struct Stack<T>{ ... }
func write<target: OutputStream> (to target: inout target)
func swap<Thing>(_ a: inout Thing, _ b: inout Thing)

二. 代码逻辑

  1. 类型推断

正确代码:

let currentLocation = Location()

错误代码:

let currentLocation: Location = Location()

  1. self推断
class BoardLocation  {
    let row: Int
    let column: Int
    init(row: Int, column: Int)  {
        self.row = row
        self.column = column
        let closure = {
            print(self.row)    
         }  
    }
}

  1. 常量
struct PhysicsModel {
    static var speedOfLightInAVacuum = 300
}
 
class Spaceship {
    static let topSpeed = PhysicsModel.speedOfLightInAVacuum
    var speed: Double?
    func fullSpeedAhead() {
        speed = Spaceship.topSpeed
    }
}

  1. 计算型类型属性

正确代码:

class Example {
    var age: UInt32 {
        return arc4random()
    }
}

错误代码:

class Example {
    var age: UInt32 {
        get {
            return arc4random()
        }
    }
}
class Person {
    var age: Int {
        get {
            return Int(arc4random())
        }
        set {
            print("That's not your age.")
        }
    }
}

  1. 单例
class ControversyManager {
    static let shared = ControversyManager()
}

  1. 错误处理

  1. 可选值

  1. 扩展声明周期

正确代码:

resource.request().onComplete { [weak self] response in
  guard let strongSelf = self else { return }
  let model = strongSelf.updateModel(response)
  strongSelf.updateUI(model)
}

错误代码:

// might crash if self is released before response returns
resource.request().onComplete { [unowned self] response in
  let model = self.updateModel(response)
  self.updateUI(model)
}
// deallocate could happen between updating the model and updating UI
resource.request().onComplete { [weak self] response in
  let model = self?.updateModel(response)
  self?.updateUI(model)
}

三. 代码结构

  1. 注释

  1. 缩进

  1. 类型

正确代码:

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

错误代码:

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

  1. 协议一致性

正确代码:

class ViewController: UIViewController {
      // 方法
} 

extension ViewController: UITableViewDataSource {
      // UITableViewDataSource 方法
}

extension ViewController: UIScrollViewDelegate {
      // UIScrollViewDelegate 方法
} 

错误代码:

class ViewController: UIViewController, UITableViewDataSource, UIScrollViewDelegate {
      // 所有方法
} 

  1. 良好的定义
final class Circle: Shape {
  var x: Int
  var y: Int
  var radius: Double
  var diameter: Double {
      get {
        returnradius * 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))"
  }
}

  1. 控制流程

正确代码:

for _ in 0..<3 {
  print("Hello three times")
}
for(index, person) in attendeeList.enumerate() {
    print("\(person)is at position #\(index)")
}
for index in 0.stride(from: 0, to: items.count, by: 2) {
  print(index)
}
for index in (0...3).reverse() {
    print(index)
}

错误代码:

var i=0 
while i<3 {
  print("Hello three times") 
  i+=1
}
var i=0
while i<3 {
  let person = attendeeList[i]
  print("\(person)is at position #\(i)")  
  i+=1
}

  1. 黄金路径

正确代码:

func computeFFT(context: Context?, inputData: InputData?)  throws -> Frequencies {
    guard let context = context else {throwFFTError.NoContext }

   guard let inputData = inputData else { throwFFTError.NoInputData }

  //计算frequencies
  return frequencies
}

错误代码:

func computeFFT(context: Context?, inputData: InputData?) throws -> Frequencies {
if let context = context {
    if let inputData = inputData {
           // 计算frequencies
          return frequencies    
    } else {
         throwFFTError.NoInputData    
     }  
   } else {
      throwFFTError.NoContext  
   }
}
guard let number1=number1, number2=number2, number3=number3 else{
    fatalError("impossible") 
}
// 处理number

  1. 语法糖
//对空的数据和字典,使用类型注解
var names:  [String] = []
var lookup:  [String: Int] = [:]

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

  1. 函数

正确代码:

let sorted = items.mergeSort() // 易发现性
rocket.launch()  // 可读性

错误代码:

let sorted = mergeSort(items)// 不易被发现
launch(&rocket)

天然的自由函数:

let value = max(x,y,z)  // another free function that feels natural

上一篇 下一篇

猜你喜欢

热点阅读