В Dart, синтаксически хороший способ привести динамический к данному типу или вернуть ноль? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть dynamic x, и я хотел бы назначить x на T s, если x is T, и в противном случае назначить null на s.В частности, я бы хотел не вводить x дважды и не создавать временные.(Например, я не хочу писать String s = map['key'] is String ? map['key'] : null; снова и снова, потому что у меня будет много таких выражений.) Я не хочу, чтобы была какая-либо вероятность ошибки во время выполнения.

Следующие работы:

class Cast<T> {
  T f(x) {
    if (x is T) {
      return x;
    } else {
      return null;
    }
  }
}

// ...

dynamic x = something();
String s = Cast<String>().f(x);

Есть ли синтаксически более хороший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 24 августа 2019

Я использую следующую служебную функцию, которая допускает необязательное запасное значение и ведение журнала ошибок.

T tryCast<T>(dynamic x, {T fallback}){
    try{
        return (x as T);
    }
    on CastError catch(e){
        print('CastError when trying to cast $x to $T!');
        return fallback;
    }
}
dynamic x = something();
String s = tryCast(x, fallback: 'nothing');
0 голосов
/ 03 октября 2018

Dart 2 имеет общие функции, которые позволяют

T cast<T>(x) => x is T ? x : null;
dynamic x = something();
String s = cast<String>(x);

. Вы также можете использовать

var /* or final */ s = cast<String>(x);

и получать String для s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...