在 Sway 中,Array
是一个固定大小的相同类型元素的集合,类似于 Tuple
。Arrays
可以容纳任意类型,包括非原始类型,在编译时确定其大小。
您可以像将数组传递给 TypeScript 函数一样轻松地将 TypeScript Array
传递给您的合约方法。
SDK 在后台处理从 TypeScript 到 Sway 的转换,允许通过类型传递预期的数据,而不管数组类型如何。
在以下示例中演示了 Sway 中的数组就是一个有类型的数组:
const numberArray: number[] = [1, 2, 3, 4, 5]; // in Sway: [u8; 5]
const boolArray: boolean[] = [true, false, true]; // in Sway: [bool; 3]
在 Sway 中,Arrays
的大小是固定的,因此存储大小是在程序编译时确定的,而不是在运行时确定的。
假设您有一个合约,它以长度为 2 的 u64
类型的数组作为参数,并返回它:
fn echo_u64_array(u64_array: [u64; 2]) -> [u64; 2] {
u64_array
}
要使用 SDK 执行合约调用,您可以这样做:
const u64Array = [10000000, 20000000];
const { value } = await contract.functions.echo_u64_array(u64Array).simulate();
expect(new BN(value[0]).toNumber()).toEqual(u64Array[0]);
expect(new BN(value[1]).toNumber()).toEqual(u64Array[1]);
您可以像前面的示例中演示的那样轻松访问和验证合约方法返回的数组。
如前所述,Sway Arrays
具有预定义的类型和大小,因此在将数组作为参数传递给合约调用时需要小心。
传递大小不正确的数组,无论它的元素数量多还是少于指定的长度,都会导致错误:
// will throw error because the array length is not 2
await contract.functions.echo_u64_array([10000000]).simulate();
类似地,传递类型不正确的数组也会导致错误:
// will throw error because the second element is not of type u64
await contract.functions.echo_u64_array([10000000, 'a']).simulate();
如果您的数组大小在运行时未知,请考虑使用 Vectors 类型,这更适合于动态大小的集合。