我遇到了一个相当普遍的问题,似乎我无法优雅而有效地解决问题。
我要将一个任意长的任意长字符串数组传递给一个可靠的契约。
在我看来,它应该像
function setStrings(string [] row)
但似乎无法完成。
我该如何解决这个问题?
答案 0 :(得分:24)
这是Solidity的限制,原因是string
基本上是一个任意长度的字节数组(即byte[]
),因此string[]
是一个二维字节数组(即byte[][]
)。根据{{3}},尚不支持二维数组作为参数。
合约函数可以接受二维数组吗?
外部调用和动态数组尚未实现 - 您只能使用一级动态数组。
解决这个问题的一种方法是,如果你知道所有字符串的最大长度(在大多数情况下是可能的),那么你可以这样做:
function setStrings(byte[MAX_LENGTH][] row) {...}
答案 1 :(得分:2)
作为参数的字符串数组尚不稳定。
答案 2 :(得分:1)
您可以将数组元素转换为字节字符串,然后将该字节字符串反序列化回函数内的数组。虽然这可能证明是相当昂贵的,但如果您没有选择,可以试试。您可以按照this短文来序列化/反序列化任何数据类型。
答案 3 :(得分:1)
字符串数组在Solidity中不可用 因为字符串基本上是字符数组 嵌套动态数组未实现
答案 4 :(得分:0)
实体数组有两种类型:静态数组和动态数组。
数组声明
静态数组:它们具有固定大小。
[maString
enumerateAttribute:NSFontAttributeName
inRange:<-- desired range -->
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
usingBlock:^(id _Nullable value, NSRange range, BOOL *_Nonnull stop) {
if (![value isKindOfClass:[UIFont class]]) {
return;
}
UIFontDescriptor *fontDescriptor = ((UIFont *)value).fontDescriptor;
NSMutableDictionary *traits = [[fontDescriptor.fontAttributes objectForKey:UIFontDescriptorTraitsAttribute] mutableCopy] ?: [NSMutableDictionary new];
traits[UIFontWeightTrait] = @(UIFontWeightSemibold);
fontDescriptor = [fontDescriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorTraitsAttribute : traits}];
UIFont *semiboldFont = [UIFont fontWithDescriptor:fontDescriptor size:fontDescriptor.pointSize];
if (semiboldFont) {
[maString addAttribute:NSFontAttributeName value:semiboldFont range:range];
}
}];
我们使用索引号访问值
动态数组:这些数组的大小会动态增大或减小。
int[5] list_of_students;
list_of_students = ["Faisal","Asad","Naeem"];
我们可以使用索引号访问该值。
int[] list_of_students;
list_of_students.push("Faisal");
list_of_students.push("Asad");
list_of_students.push("Smith");
和push
函数用于插入和删除值。 length函数用于测量数组的长度。
答案 5 :(得分:0)
可以通过使用
pragma experimental ABIEncoderV2;
然后,您可以在合同的顶部使用动态字符串数组。例如
string[] memory myStrings;