Swift函数提前返回实例详解

2020-01-09 00:17:37于海丽
  • 将方法提前返回,让我们函数尽可能的快的返回。
  • 使用 guard 替代 if,以避免嵌套。
    
    class NoteListViewController: UIViewController {
    @objc func handleChangeNotification(_ notification: Notification) {
    let noteInfo = notification.userInfo?["note"] as? [String : Any]
    
    guard let id = noteInfo?["id"] as? Int else {
    return
    }
    
    guard let note = database.loadNote(withID: id) else {
    return
    }
    
    notes[id] = note
    tableView.reloadData()
    }
    }

    将函数提前返回能够将功能失败的情况处理得更加清晰,这不仅提高了可读性(更少的缩进,更少的嵌套),同时也有利于单元测试。

    我们可以进一步改进代码,将获取 noteID 和类型转换的代码放在 Notification Extension 中,这样就将 handleChangeNotification 业务逻辑和具体细节分离开来。修改后代码如下所示:

    
    private extension Notification {
    var noteID: Int? {
    let info = userInfo?["note"] as? [String : Any]
    return info?["id"] as? Int
    }
    }
    
    class NoteListViewController: UIViewController {
    @objc func handleChangeNotification(_ notification: Notification) {
    guard let id = notification.noteID else {
    return
    }
    
    guard let note = database.loadNote(withID: id) else {
    return
    }
    
    notes[id] = note
    tableView.reloadData()
    }
    }

    这种结构还大大简化了调试的难度,我们可以直接在每个 guard 中 return 中添加断点来截获所有失败情况,而不需要单步执行所有逻辑。

    条件构造

    当构造一个对象实例,非常普遍的需求是需要构建哪类对象取决于一系列的条件。

    例如,启动应用程序时显示哪个 view controller 取决于: