如何在 Swift 中测试带有关联值的枚举的相等性?
在 Swift 中,您可以使用 Equatable 协议来比较带有关联值的枚举。在本文中,我们将通过一个示例了解如何使用 Equatable 协议来比较它们。
带有关联值的枚举
在 Swift 中,您可以为枚举情况提供一个值。这使得 Swift 中的枚举更加强大。Swift 中称为带有关联值的枚举的功能使您能够设计一种类型,该类型可以具有一组有限的情况,每种情况都可以具有一组唯一的任何类型的关联值。这使您能够将数据链接到每种枚举情况。
以下是如何创建带有关联值的枚举的示例:
enum Temperature { case Celsius(Double) case Fahrenheit(Double) case Kelvin(Double) }
此示例中的 Temperature 枚举有三种情况:Celsius、Fahrenheit 和 Kelvin。每种情况都关联了一个类型为 Double 的值。
示例
因此,您可以像这样生成 Temperature 枚举的实例
let celsius = Temperature.Celsius(25.0) let fahrenheit = Temperature.Fahrenheit(77.0) let kelvin = Temperature.Kelvin(298.0) print("Temperature in Celsius:", celsius) print("Temperature in Fahrenheit:", fahrenheit) print("Temperature in Kelvin:", kelvin)
输出
Temperature in Celsius: Celsius(25.0) Temperature in Fahrenheit: Fahrenheit(77.0) Temperature in Kelvin: Kelvin(298.0)
示例
这是如何将关联值用于枚举的示例。在以下示例中,temperatureString 函数接受一个作为 Temperature 枚举实例的参数,并返回一个表示温度的字符串。使用 switch 语句匹配枚举的不同情况,然后提取相关值并用于构建字符串。
import Foundation enum Temperature { case Celsius(Double) case Fahrenheit(Double) case Kelvin(Double) } func temperatureString(_ temperature: Temperature) -> String { switch temperature { case .Celsius(let value): return "\(value)°C" case .Fahrenheit(let value): return "\(value)°F" case .Kelvin(let value): return "\(value) K" } } let celsius = Temperature.Celsius(25.0) print(temperatureString(celsius))
输出
25.0
如何比较它们?
在上面的枚举中,我们将使用 Equatable 协议来比较两个枚举。在此示例中,celsius1 和 celsius2 具有相同的情况和相同的关联值“25.0”,因此它们被认为是相等的。另一方面,celsius1 和 celsius3 具有相同的情况,但关联值不同,因此它们不被认为是相等的。
示例
import Foundation enum Temperature: Equatable { case Celsius(Double) case Fahrenheit(Double) case Kelvin(Double) } let celsius1 = Temperature.Celsius(25.0) let celsius2 = Temperature.Celsius(25.0) let celsius3 = Temperature.Celsius(27.2) if celsius1 == celsius2 { print("celsius1 and celsius2 are equal") } else { print("celsius1 and celsius2 are not equal") } if celsius1 == celsius3 { print("celsius1 and celsius3 are equal") } else { print("celsius1 and celsius3 are not equal") }
输出
celsius1 and celsius2 are equal celsius1 and celsius3 are not equal
结论
Swift 通过您可以在其中将值与枚举情况关联的强大枚举为您提供了强大的功能。您可以定义 n 个带有任何类型关联值的情况。您也可以在 Swift 中将自定义类型与枚举关联。
即使具有关联值,您也可以比较枚举实例。例如,您希望比较两个类似于自定义对象的枚举对象。为了比较枚举,您必须在枚举声明时符合 Equatable 协议。此协议使您能够比较枚举对象。