断言和先决条件是在运行时所做的检查。你可以用他们来检查在执行后续代码之前是否一个必要的条件已经被满足了。如果断言或者先决条件中的布尔条件评估的结果为true
(真),则代码像往常一样继续执行。如果布尔条件评估结果为false
(假),程序的当前状态是无效的,则代码执行结束,应用程序终止。
断言帮助你在开发阶段找到错误和不正确的假设,先决条件帮助你在生产环境中探测到存在的问题。
断言和先决条件的不同点是,他们什么时候进行状态检测:断言仅在调试环境运行,而先决条件则在调试环境和生产环境中运行。在生产环境中,断言的条件将不会进行评估。这个意味着你可以使用很多断言在你的开发阶段,但是这些断言在生产环境中不会产生任何影响。
使用断言进行调试
你可以调用Swift标准库的assert(_:_:file:line:)
函数来写一个断言。向这个函数传入一个结果为true
或者false
的表达式以及一条信息,当表达式的结果为false
的时候这条信息会被显示。
let age = -3 //因为age<0,所以断言会触发 assert(age >=0,"A person's age cannot be less than zero")
如果不需要断言信息,可以就像这样忽略掉。
assert(age >= 0)
如果代码已经检查了条件,你可以使用assertionFailure(_:file:line:)
函数来表明断言失败了。
if age > 10 { print("You can ride the roller-coaster or the ferris wheel.") }else if age > 0{ print("You can ride the ferris wheel.") }else{ assertionFailure("A person's age can't be less than zero.") }
强制执行先决条件
当一个条件可能为假,但是继续执行代码要求条件必须为真的时候,需要使用先决条件。例如使用先决条件来检查是否下标越界,或者来检查是否将一个正确的参数传给函数。
你可以使用全局precondition(_:_:file:line:)
函数来写一个先决条件。向这个函数传入一个结果为true
或者false
的表达式以及一条信息,当表达式的结果为false
的时候这条信息就会被显示。
//在下一个下标的实现里... precondition(index > 0,"Index must be greater than zero.")
你可以调用preconditionFailure(_:file:line:)
方法来表明出现了一个错误,例如,switch
进入了default
分支,但是所有的有效值应该被任意一个其他分支(非default
分支)处理。
注:
如果你使用unchecked
模式(-Ounchecked
)编译代码,先决条件将不会进行检查。编译器假设所有的先决条件总是为true
(真),他将优化你的代码。然而,fatalError(_:file:line:)
函数总是中断执行,无论你怎么进行优化设定。
你能使用fatalError(_:file:line:)
函数在设计原型和早期开发阶段,这个阶段只有方法的声明,但是没有具体实现,你可以在方法中写上fatalError("Unimplemented")
作为具体实现。因为fatalError
不会像断言和先决条件那样被优化掉,所以你可以确保当代码执行到一个没有被实现的方法时,程序会被中断。