Swift 编码规范总结(进击)

2019-10-19  本文已影响0人  SoaringHeart
    •   在 init 中设置参数时显性地使用 self 。
    •   在 non-escaping closures 中显性地使用 self 。
    •   在避免命名冲突时使用 self 。例:
class BoardLocation  {
    let row: Int, column: Int
    init(row: Int, column: Int)  {
        self.row = row
        self.column = column
        let closure = {
            print(self.row)    
         }  
    }
}
var subview: UIView?
var volume: Double?
if let subview = subview, let volume = volume {
  // 使用展开的 subview 和 volume 做某件事
}
当用 guard 或 if let 解包多个可选值时,在可能的情况下使用最下化复合版本嵌套。举例:
推荐:
guard let number1 = number1,
      let number2 = number2,
      let number3 = number3 else {
  fatalError("impossible")
}
// Correct
NSNumber() as? Int

// Wrong
NSNumber() as! Int

// 建议写法
navigationController?.pushViewController(myViewController, animated: true)
        
// 不建议写法
navigationController!.pushViewController(myViewController, animated: true)

let url = NSURL(string: "http://www.baidu.com")!
print(url)

return cell!
使用惯用语法 [weak self] 和 guard let self = self else { return } 来延长对象的生命周期。 在 self 超出闭包生命周期不明显的地方,[weak self] 更优于 [unowned self]。 明确地延长生命周期优于可选解包。
推荐:
resource.request().onComplete { [weak self] response in
  guard let self = self else {
    return
  }
  let model = self.updateModel(response)
  self.updateUI(model)
}
不推荐:
// 如果在响应返回前 self 被释放,则可能导致崩溃
resource.request().onComplete { [unowned self] response in
  let model = self.updateModel(response)
  self.updateUI(model)
}
不推荐:
// 内存回收可以发生在更新模型和更新 UI 之间
resource.request().onComplete { [weak self] response in
  let model = self?.updateModel(response)
  self?.updateUI(model)
}
// Correct
func a() throws {}; do { try a() } catch {}
// Wrong
func a() throws {}; try! a()
// Correct
[1, 2].map { $0 + 1 }
[1, 2].map { number in
    number + 1 
}
let isEmpty = [1, 2].isEmpty()
UIView.animateWithDuration(0.3, animations: {
   self.disableInteractionRightView.alpha = 0
}, completion: { _ in
   ()
})

// Wrong
[1, 2].map() { $0 + 1 }

[1, 2].map( ) { $0 + 1 }
[1, 2].map() { number in
    number + 1 
}
[1, 2].map(  ) { number in
    number + 1 
}

protocol workSelectViewDelegate: class {
@objc protocol workSelectViewDelegate {
(oc类型的protocol只有class实现。)
// Correct
protocol Foo {
    var bar: String { get set }
}
class ControversyManager {
    static let sharedInstance = ControversyManager()
    private init() {}
}
// Correct
switch foo {
case .bar, .bar2, .bar3:
    something()
}

// Wrong
switch foo {
case .bar:
    fallthrough
case .bar2:
    something()
}
// 建议写法
navigationController?.pushViewController(myViewController, animated: true)
 var foo: Int {
     return 20 
  } 
正确代码:
extension Int {
    var doubleValue: Double {
        return Double(self)
    }
}

//调用
intValue.doubleValue
错误代码:
func doubleValue(_ value: Int) -> Double {
    return Double(value)
}

//调用
doubleValue(intValue)
推荐为协议方法加一个单独的扩展,尤其是为一个模型加入协议遵循的时候。这可以让有关联的协议方法被分组在一起,也可以简化用类关联方法向这个类添加协议的指令。

推荐:

class MyViewController: UIViewController {
  // 类填充在这
}

// MARK: - UITableViewDataSource
extension MyViewController: UITableViewDataSource {
  // table view 的数据源方法
}

// MARK: - UIScrollViewDelegate
extension MyViewController: UIScrollViewDelegate {
  // scroll view 的代理方法
}
上一篇 下一篇

猜你喜欢

热点阅读