什么时候应该使用断言和前置条件,什么时候可以使用保护语句、强制解包和错误处理?

When should you use assertions and preconditions and when you can use guard statements, forced unwrapping and error handling?

我已经阅读 。但仍然无法在(不同的解包方式,即 guard! + 错误处理)与断言之间划清界限。

如果我想让我的应用程序不再工作,我不能强制展开某些东西并替换为先决条件吗?

  1. 是否因为我们想要stop/exit应用程序并且基本上不希望任何控制流或状态改变因此我们使用 asserts/preconditions 这也恰好伴随着人类可读消息的简单记录(帮助我们不经常写 prints)?
  2. 我们为 have 使用断言的东西是至关重要的,保护语句最终是一个控制流系统,即使你的函数 returns 早并不一定意味着你的应用程序应该崩溃。

如果它超出了 nils 就像你想要一个 String 并且用户给你一个 Int 然后您可以使用 错误处理.

编辑:

我不是在征求意见,我问这个只是为了了解 断言 比上述替代方案提供了哪些便利。编号列表是我问题的核心。

  • 错误是流控制的一种形式,与ifwhile相当。特别是,它们涉及连贯的 消息发送 提前退出 。想法是立即结束当前作用域并将return控制权交给调用者,告诉调用者"something went wrong".

  • 断言是一种立即崩溃的方法。

因此它们属于完全不同的概念世界。错误是针对可能实时出错的事情,我们需要从中连贯地恢复。断言是针对那些永远不应该出错的事情,我们强烈地认为我们不希望在这种情况下甚至将程序发布到世界上,并且可以在不能使用错误的地方使用断言。

我自己的代码示例:

final class Board : NSObject, NSCoding, CALayerDelegate {
    // ...
    fileprivate var xct : Int { return self.grid.xct }
    fileprivate var yct : Int { return self.grid.yct }
    fileprivate var grid : Grid // can't live without a grid, but it is mutable
    // ...
    fileprivate lazy var pieceSize : CGSize = {
        assert((self.xct > 0 && self.yct > 0), "Meaningless to ask for piece size with no grid dimensions.")
        let pieceWidth : CGFloat = self.view.bounds.size.width / (CGFloat(self.xct) + OUTER + LEFTMARGIN + RIGHTMARGIN)
        let pieceHeight : CGFloat = self.view.bounds.size.height / (CGFloat(self.yct) + OUTER + TOPMARGIN + BOTTOMMARGIN)
        return CGSize(width: pieceWidth, height: pieceHeight)
    }()
    // ...
}

如果 pieceSize 曾经 使用零网格维度调用,则 我的整个程序 出了点问题。这不是测试运行时错误的问题;该程序本身基于错误的算法。这就是我想要检测的。