我已经阅读了Difference between “precondition” and “assert” in swift。但仍然无法在(不同的展开方式,即guard
& !
+ 错误处理)与断言之间划清界线。
如果我希望我的应用程序不再起作用,我不能只强制打开一些东西并替换前提条件吗?
print
s)?如果超出nil
之类的任何内容,就像你想要一个 String 而用户正在给你一个 Int 那么你可以使用错误处理
修改
我不是在发表意见,我只是想要了解这些替代方案断言提供的便利性。编号列表是我问题的核心。
答案 0 :(得分: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
,那么我的整个程序就会出现问题。这不是测试运行时错误的问题;程序本身基于错误的算法。这就是我想要发现的。