Dart:如何检查对象列表是否为字符串/整数/布尔值列表

vdzxcuhz  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(149)

对于简单的数据类型,您可以使用例如

object is String

以检查Object变量是否属于更具体的类型。
但是假设你有一个List,但是想检查它是否是一个String的List,直觉上我们可以尝试

List list = ['string', 'other string'];
print(list is List<String>);

其返回假。
类似地,使用List.cast()方法也没有帮助,它总是会成功,只是在稍后使用列表时抛出一个错误。
我们可以遍历整个列表并检查每个条目的类型,但我希望有更好的方法。

taor4pac

taor4pac1#

没有其他方法。您拥有的是List<Object?>/List<dynamic>(因为类型是从变量类型推断的,变量类型是一个原始的List类型,它被示例化到它的绑定)。列表 currently 只包含String对象,但没有什么阻止您向其中添加new Object()
所以对象本身并不知道它只包含字符串,你必须查看每个元素来检查它.
或者,当你创建一个列表的时候,只要声明变量为List<String> list = ...;var list = ...;,那么对象就是List<String>,如果你不是创建列表的人,那么它又回到list.every((e) => e is String)

wgeznvg7

wgeznvg72#

List中的每个元素可以是任何类型,但是如果您确信所有元素都具有相同的类型,那么这种方法可能会很有用

bool listElementIs<T>(List l) {
  if (l.isEmpty) return true;
  try {
    if (l[0] is T) return true; // only try to access to check element
  } catch (e) {
    return false;
  }
  return false;
}

void main() {
  List list = ['string', 'other string'];
  print(listElementIs<String>(list)); // prints 'true'
  print(listElementIs<int>(list)); // prints 'false'
}
b1payxdu

b1payxdu3#

我认为更好的方法是对数据类型进行具体说明。
通过指定变量的类型,可以在开发过程的早期捕获潜在的错误。
此外,指定变量的类型使代码更易读和理解。
此外,指定类型还可以提高代码的性能,因为编译器可以根据变量的类型进行某些优化。

List<String> list = <String>['string', 'other string'];
  print(list is List<String>); /// prints true.

您可以使用此linter规则来强制执行它:
https://dart-lang.github.io/linter/lints/always_specify_types.html

相关问题