Swift - 断言和前提条件



Swift 提供了两种特殊的机制:断言和前提条件,允许开发者在程序中强制执行一些特殊条件,用于调试和确保程序的正确性。这两种方法通过捕获和处理应用程序开发不同阶段出现的意外情况,创建健壮可靠的 Swift 应用程序。

Swift 断言

断言是一个强大的调试工具,用于检查和修复应用程序开发过程中的错误或bug。或者可以说,其主要目的是在运行时捕获和识别错误或bug。它用布尔条件表示,如果条件计算结果为真,则程序将继续执行。而如果条件计算结果为假,则程序的执行将终止。断言是不可恢复的,这意味着如果断言失败,我们无法恢复或捕获它。我们可以使用 `assert()` 函数实现断言。

**`assert(_:_:file:line)`** 函数在开发期间执行运行时检查。或者可以说,它实现了 C 风格的断言。

语法

以下是 `assert()` 函数的语法:

func assert(_condition: @autoclosure()->Bool,
_message: @autoclosure() -> String = String(),
file: StaticString = #file,
line: UInt = #line)

参数

此函数采用以下参数:

  • **`condition`** - 它表示测试条件。

  • **`message`** - 它表示当条件设置为假时将显示的消息。默认值为为空。

  • **`file`** - 它表示断言所在的文件名,如果断言失败,则会与消息一起显示。这是一个可选参数。

  • **`line`** - 它表示断言所在的行号,如果断言失败,则会与消息一起显示。这是一个可选参数。

示例

import Foundation

func validateMarks(_ marks: Int) {

   // Assert that the marks is non-negative
   // If the given condition fails, then the program will terminated 
   // And will display this message
   assert(marks >= 0, "Marks must be non-negative value")
    
   print("Marks are valid")
}
validateMarks(345)

输出

Marks are valid

示例

如果我们输入负数分数,则断言中的给定条件将失败,程序将终止。

import Foundation

func validateMarks(_ marks: Int) {

   // Assert that the marks is non-negative
   // If the given condition fails, then the program will terminated 
   // And will display this message
   assert(marks >= 0, "Marks must be non-negative value")
    
   print("Marks are valid")
}
validateMarks(-39)

输出

main/main.swift:8: Assertion failed: Marks must be non-negative value
Current stack trace:
0    libswiftCore.so                    0x00007f8870bbcdc0 _swift_stdlib_reportFatalErrorInFile + 112
1    libswiftCore.so                    0x00007f887088691c <unavailable> + 1444124
2    libswiftCore.so                    0x00007f8870886738 <unavailable> + 1443640
3    libswiftCore.so                    0x00007f8870885220 _assertionFailure(_:_:file:line:flags:) + 419
6    swift-frontend                     0x0000557401fc6b3d <unavailable> + 26479421
7    swift-frontend                     0x00005574012fadb9 <unavailable> + 13061561
8    swift-frontend                     0x00005574010cb4c6 <unavailable> + 10769606
9    swift-frontend                     0x00005574010c79b6 <unavailable> + 10754486
.......................................................................
....................................................................
..................................................................

Swift 前提条件

前提条件用于在代码执行时捕获和处理意外状态和假设。或者可以说,前提条件帮助开发者在应用程序的生产状态下查找问题。

它也用布尔条件表示,如果条件计算结果为真,则程序将继续执行。而如果条件计算结果为假,则程序的执行将终止。它也是不可恢复的。我们可以使用 **`precondition()`** 函数实现前提条件。

**`precondition(_:_:file:line)`** 函数用于在程序执行期间强制执行条件。

语法

以下是 `assert()` 函数的语法:

func precondition(_condition: @autoclosure()->Bool,
_message: @autoclosure() -> String = String(),
file: StaticString = #file,
line: UInt = #line)

参数

此函数采用以下参数:

  • **`condition`** - 它表示测试条件。

  • **`message`** - 它表示当条件设置为假时将显示的消息。默认值为为空。

  • **`file`** - 它表示前提条件所在的文件名,如果前提条件失败,则会与消息一起显示。这是一个可选参数。

  • **`line`** - 它表示前提条件所在的行号,如果前提条件失败,则会与消息一起显示。这是一个可选参数。

示例

import Foundation

func modulus(_ num: Int, by deno: Int) -> Int {

   // Ensure that the denominator is not zero before performing the modulus
   precondition(deno != 0, "The value of denominator must be non-zero")

   return num % deno
}

let output = modulus(19, by: 3)
print("Result: \(output)")  

输出

Result: 1

示例

如果我们输入零分母,则前提条件中的给定条件将失败,程序将终止。

import Foundation

func modulus(_ num: Int, by deno: Int) -> Int {

   // Ensure that the denominator is not zero before performing the modulus
   precondition(deno != 0, "The value of denominator must be non-zero")

   return num % deno
}

let output = modulus(19, by: 0)
print("Result: \(output)")  

输出

main/main.swift:6: Precondition failed: The value of denominator must be non-zero
Current stack trace:
0    libswiftCore.so                    0x00007fbee7245dc0 _swift_stdlib_reportFatalErrorInFile + 112
1    libswiftCore.so                    0x00007fbee6f0f91c <unavailable> + 1444124
2    libswiftCore.so                    0x00007fbee6f0f738 <unavailable> + 1443640
3    libswiftCore.so                    0x00007fbee6f0e220 _assertionFailure(_:_:file:line:flags:) + 419
6    swift-frontend                     0x0000558e85a69b3d <unavailable> + 26479421
7    swift-frontend                     0x0000558e84d9ddb9 <unavailable> + 13061561
8    swift-frontend                     0x0000558e84b6e4c6 <unavailable> + 10769606
9    swift-frontend                     0x0000558e84b6a9b6 <unavailable> + 10754486
.......................................................................
....................................................................
..................................................................
广告