Sway Enums 与 TypeScript Enums 有一些不同之处。在本文档中,我们将探讨如何在 SDK 中表示 Sway Enums,以及如何在 Sway 合约函数中使用它们。
考虑下面的基本 Sway Enum,名为 StateError
:
pub enum StateError {
Void: (),
Pending: (),
Completed: (),
}
类型 ()
表示每个 Enum 变体都没有关联的额外数据。Sway 允许您创建 Enums of Enums 或将类型与 Enum 变体关联起来。
让我们定义一个 Sway 合约函数,它以 StateError
Enum 变体作为参数,并返回它:
fn echo_state_error_enum(state_error: StateError) -> StateError {
state_error
}
要执行合约函数并验证响应,我们可以使用以下代码:
const enumVariant = 'Completed';
const { value } = await contract.functions.echo_state_error_enum(enumVariant).simulate();
expect(value).toEqual(enumVariant);
在此示例中,我们只需将 Enum 变体作为值传递以执行合约函数调用。
在此示例中,Error
Enum 是其他两个 Enums:StateError
和 UserError
的 Enum。
pub enum StateError {
Void: (),
Pending: (),
Completed: (),
}
pub enum UserError {
Unauthorized: (),
InsufficientPermissions: (),
}
pub enum Error {
StateError: StateError,
UserError: UserError,
}
现在,让我们创建一个 Sway 合约函数,它接受 Error
Enum 的任何变体作为参数,并立即将其返回。这个变体可以来自 StateError
或 UserError
Enums。
fn echo_error_enum(error: Error) -> Error {
error
}
由于 Error
Enum 是 Enums 的 Enums,我们需要以不同的方式传递函数参数。参数将是一个 TypeScript 对象:
const userErroVar = 'InsufficientPermissions';
const enumParam = { UserError: userErroVar };
const { value } = await contract.functions.echo_error_enum(enumParam).simulate();
expect(value).toEqual(enumParam);
在这种情况下,由于变体 InsufficientPermissions
属于 UserError
Enum,我们使用 Enum 名称作为对象键,将变体作为对象值创建一个 TypeScript 对象。
如果我们打算使用 StateError
Enum 中的变体,我们将采用相同的方法:
const stateErrorVar = 'Completed';
const enumParam = { StateError: stateErrorVar };
const { value } = await contract.functions.echo_error_enum(enumParam).simulate();
expect(value).toEqual(enumParam);