【问题标题】:is there a way to perform optional casting in Dart?有没有办法在 Dart 中执行可选转换?
【发布时间】:2021-05-19 08:11:09
【问题描述】:

在 Swift 或 Kotlin 中我可以做这样的事情

var fullName = myMap["fullName"] as? String

那么 fullName 数据类型将是可选的 String ( String? )。

我需要在这样的类型检查之后获取可选类型

我不能直接对该映射执行空合并运算符,因为 dart 会给出奇怪的结果。比如这样

// 'data' is Map<String, dynamic>

final fullName = data["fullname"] ?? "John Doe";
final double myNumber = fullName;

如您所见,IDE 根本不会显示错误,我希望fullName 将是一个字符串,因此当我将一个需要双精度的字符串分配给myNumber 时会出现错误。

【问题讨论】:

  • 你为什么不能只做var name = myMap["fullName"] ?? "John Doe";
  • 我在上面编辑我的问题:)

标签: dart


【解决方案1】:

如果您事先知道data["fullname"]String,那么您可以这样做:

final fullName = (data["fullname"] ?? "John Doe") as String;

如果data["fullname"] 在运行时结果不是String,你会从转换失败中得到一个运行时异常。如果这是您需要处理的事情,那么您可以轻松地创建一个简单的辅助函数,该函数首先检查 dynamic 值是否是所需的类型,如果不是则返回 null

T? tryCast<T>(dynamic object) => object is T ? object : null;

final fullName = tryCast<String>(data["fullname"]) ?? "John Doe";

现在fullName 静态已知为String,并且意外地将其分配给double 将是编译时错误。

【讨论】:

    【解决方案2】:

    在 Kotlin 中已知的 safe nullable cast operator 目前在 Dart 中不存在 but it soon might

    不过,在你的情况下,为什么不简单地写

    String? fullname = myMap["fullname"];
    

    如果myMap["fullname"] 包含非空字符串以外的任何内容,Kotlin 中的可空转换运算符 as? 将生成 null。只要您只处理字符串或空值,上述方法就可以了。 (如果除了 String 或 null 之外还有其他内容,它会崩溃,这可能比在大多数情况下继续使用 null 更好)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2010-12-07
      • 1970-01-01
      相关资源
      最近更新 更多