-2

我已经在 swift 中阅读了“前提条件”和“断言”之间的区别guard但仍然无法在(展开即& ! +错误处理的不同方式)与断言之间划清界限。

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

  1. 是不是因为我们想要停止/退出应用程序并且基本上不希望任何控制流或状态更改,因此我们使用断言/前提条件,这也恰好伴随着人类可读消息的简单记录(帮助我们不经常print写)?
  2. 我们使用断言的东西是至关重要的,守卫语句最终是一个控制流系统,即使你的函数提前返回并不一定意味着你的应用程序应该崩溃。

如果它超出了nils 的范围,比如你想要一个String并且用户给你一个Int,那么你可以使用error handling

编辑:

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

4

1 回答 1

3
  • 错误是流控制if的一种形式,与和相提并论while。特别是,它们涉及连贯的消息发送提前退出。这个想法是立即结束当前范围并将控制权返回给调用者,告诉调用者“出了点问题”。

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

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

我自己的代码示例:

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以零网格维度调用,那么我的整个程序就有问题了。这不是测试运行时错误的问题。该程序本身基于错误的算法。这就是我想要检测的。

于 2017-02-24T16:40:09.897 回答