Как получить доступ к аргументу Switch внутри кейса в Dart - PullRequest
1 голос
/ 22 мая 2019

Я хочу включить животных и предпринять соответствующие действия.

switch (animal.runtimeType) {
  case Cat:
    animal.pet();
    break;
  case Crocodile:
    animal.runAway();
    break;
  default:
    print('Not a known animal.');
} 

Если бы я был цепочкой if, это работало бы, так как область видимости знала бы тип animal в блоке if (animal is Cat){}.

По какой-то причине это не относится к операторам switch. В этом случае я получу ошибку

The method pet() isn't defined for the class animal

Как я могу использовать утверждение случая в блоке дела? Я не могу использовать as, так как мой CI Lint не позволяет этого (что хорошо), и нет смысла использовать операцию If внутри кейса, поскольку использование оператора if-else было бы меньше кода и предлагало бы больше удобство и простота использования.

Ответы [ 2 ]

3 голосов
/ 22 мая 2019

Я не уверен, не понял ли я ваш вопрос или вы не поняли проблему.

Если вы определили метод pet() внутри Cat, но не внутри Animal, ошибка The method pet() isn't defined for the class animal возникает из-за того, что Animal является общим. Animal не обязательно является Cat, поэтому вы не можете вызвать метод pet() для Animal, поскольку он определен только внутри Cat.

Тем не менее, абсолютно безопасно разыгрывать внутри блока корпуса. Вы можете надежно сделать (animal as Cat).pet();, как только вы проверили, что animal действительно Cat.

0 голосов
/ 22 мая 2019

Ваш код не будет работать в Dart.
Вместо этого вы должны использовать следующий код:

void main() {
  var animal = null;
  if (animal is Cat) {
    animal.pet();
  } else if (animal is Crocodile) {
    animal.runAway();
  } else {
    print('Not a known animal.');
  }
}

class Cat {
  void pet() {
    //
  }
}

class Crocodile {
  void runAway() {
    //
  }
}
...