Icon LinkEnums

Sway Enums 与 TypeScript Enums 有一些不同之处。在本文档中,我们将探讨如何在 SDK 中表示 Sway Enums,以及如何在 Sway 合约函数中使用它们。

Icon Link基本的 Sway Enum 示例

考虑下面的基本 Sway Enum,名为 StateError

pub enum StateError {
    Void: (),
    Pending: (),
    Completed: (),
}

类型 () 表示每个 Enum 变体都没有关联的额外数据。Sway 允许您创建 Enums of Enums 或将类型与 Enum 变体关联起来。

Icon Link将 Sway Enums 用作函数参数

让我们定义一个 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 变体作为值传递以执行合约函数调用。

Icon LinkEnum of Enums 示例

在此示例中,Error Enum 是其他两个 Enums:StateErrorUserError 的 Enum。

pub enum StateError {
    Void: (),
    Pending: (),
    Completed: (),
}
 
pub enum UserError {
    Unauthorized: (),
    InsufficientPermissions: (),
}
 
pub enum Error {
    StateError: StateError,
    UserError: UserError,
}

Icon Link使用 Enums of Enums 与合约函数

现在,让我们创建一个 Sway 合约函数,它接受 Error Enum 的任何变体作为参数,并立即将其返回。这个变体可以来自 StateErrorUserError 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);