什么时候应该使用断言和前置条件,什么时候可以使用保护语句、强制解包和错误处理?
When should you use assertions and preconditions and when you can use guard statements, forced unwrapping and error handling?
我已经阅读 。但仍然无法在(不同的解包方式,即 guard
和 !
+ 错误处理)与断言之间划清界限。
如果我想让我的应用程序不再工作,我不能强制展开某些东西并替换为先决条件吗?
- 是否因为我们想要到stop/exit应用程序并且基本上不希望任何控制流或状态改变因此我们使用 asserts/preconditions 这也恰好伴随着人类可读消息的简单记录(帮助我们不经常写
print
s)?
- 我们为 have 使用断言的东西是至关重要的,保护语句最终是一个控制流系统,即使你的函数 returns 早并不一定意味着你的应用程序应该崩溃。
如果它超出了 nil
s 就像你想要一个 String 并且用户给你一个 Int 然后您可以使用 错误处理.
编辑:
我不是在征求意见,我问这个只是为了了解 断言 比上述替代方案提供了哪些便利。编号列表是我问题的核心。
错误是流控制的一种形式,与if
和while
相当。特别是,它们涉及连贯的 消息发送 和 提前退出 。想法是立即结束当前作用域并将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
曾经 使用零网格维度调用,则 我的整个程序 出了点问题。这不是测试运行时错误的问题;该程序本身基于错误的算法。这就是我想要检测的。
我已经阅读 guard
和 !
+ 错误处理)与断言之间划清界限。
如果我想让我的应用程序不再工作,我不能强制展开某些东西并替换为先决条件吗?
- 是否因为我们想要到stop/exit应用程序并且基本上不希望任何控制流或状态改变因此我们使用 asserts/preconditions 这也恰好伴随着人类可读消息的简单记录(帮助我们不经常写
print
s)? - 我们为 have 使用断言的东西是至关重要的,保护语句最终是一个控制流系统,即使你的函数 returns 早并不一定意味着你的应用程序应该崩溃。
如果它超出了 nil
s 就像你想要一个 String 并且用户给你一个 Int 然后您可以使用 错误处理.
编辑:
我不是在征求意见,我问这个只是为了了解 断言 比上述替代方案提供了哪些便利。编号列表是我问题的核心。
错误是流控制的一种形式,与
if
和while
相当。特别是,它们涉及连贯的 消息发送 和 提前退出 。想法是立即结束当前作用域并将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
曾经 使用零网格维度调用,则 我的整个程序 出了点问题。这不是测试运行时错误的问题;该程序本身基于错误的算法。这就是我想要检测的。