什么时候使用Swift的fatalError(),precondition()或assertion()函数?

时间:2019-07-12 04:35:02

标签: ios swift error-handling uikit runtime-error

在试图解决无法恢复的问题时,我正在尝试确定Swift暂停功能的用例。与precondition()相比,fatalError()何时应使用?

我已经阅读了documentation,看来使用precondition()的唯一好处是在创建-unchecked构建时进行了一些优化,但是在到达该代码而又不满足前提条件的情况下,文档指出这是一个严重的编程错误。哪种类型的编程错误将导致不满足前提条件而到达此代码?与fatalError()可以更适当地处理的相比?与assert()相比?

以下是我目前针对每种类型的用例:


assert()

var coreDataContainer: CoreDataContainer?
...

override func viewDidLoad() {
    super.viewDidLoad()

    assert(coreDataContainer != nil, "CoreDataContainer property not set")
    ...
}

前提条件()

var headerSize: CGSize?
...

override func prepare() {
    super.prepare()

    precondition(headerSize != nil, "Header size not set. Header size must be set by client before layout occurs.")
    ...
}

fatalError()

var fetchedResultsController: NSFetchedResultsController?
...

func numberOfSections(in tableView: UITableView) -> Int {

    if let frc = self._fetchedResultsController {
        return frc.sections!.count
    }

    return 0
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    guard let sections = self._fetchedResultsController?.sections else {
        fatalError("NSFetchedResultsController sections are nil. Expected section number \(section).")
    }
    ...
}

我希望用户不会接到这些电话。 这些示例中是否有一个不好的选择?

0 个答案:

没有答案