我有一个 FailureOrSuccess 的密封类,其中包含 Success 和 Failure.ch 的子类
Failure 子类也是一个密封类,具有针对不同类型故障的多个子类。
我想要一个在失败和成功之间切换的 switch 语句,并且在失败代码块内有另一个允许我在不同失败选项之间切换的 switch 语句?
是否可以使用嵌套密封类来做到这一点?
(这是我下面尝试做的一个示例,尽管这不起作用)。
switch (state.authFailureOrSuccessOption) {
case Success(): {
context.router.replace(const DailyRoute());
}
case Failure(): {
String text;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(switch (???) {
case CancelledByUser:
return 'Cancelled';
case ServerError:
return 'Server Error';
case EmailAlreadyInUse:
return 'Email already in use';
case InvalidEmailAndPasswordCombination:
return 'Invalid email and password combination';
case UnknownError:
return 'An unknown error occurred';
}),));
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的密封类列表供参考:
// Overall Class
sealed class FailureOrSuccess {
const FailureOrSuccess();
}
// Level 2 Subclass
class Success extends FailureOrSuccess {
const Success();
}
sealed class Failure extends FailureOrSuccess {
const Failure();
}
// Level 3 Subclass
sealed class AuthFailure extends Failure {
const AuthFailure();
}
// Leven 4 Subclasses of AuthFailure
class CancelledByUser extends AuthFailure {
const CancelledByUser();
}
class ServerError extends AuthFailure {
const ServerError();
}
class EmailAlreadyInUse extends AuthFailure {
const EmailAlreadyInUse();
}
class InvalidEmailAndPasswordCombination extends AuthFailure {
const InvalidEmailAndPasswordCombination();
}
class UnknownError extends AuthFailure {
const UnknownError();
}
Run Code Online (Sandbox Code Playgroud)
是的。
详尽性检查算法尚未完全实现,但它的目的是使像上面这样的类层次结构能够工作。
不过,您需要以case不同的方式编写模式。
用于:
case CancelledByUser _:
// or
case CancelledByUser():
Run Code Online (Sandbox Code Playgroud)
实际上是case CancelledByUser:将开关值与Type对象的类型进行比较CancelledByUser(这永远不会成功,因为该CancelledByUser对象不是Type对象并且不等于一),它实际上并没有进行类型检查。或模式进行类型检查case CancelledByUser _:。case CancelledByUser():
您可以嵌套开关,使用外部匹配的提升/检查类型作为匹配值,并且可以在表达式位置使用开关表达式:
case Failure fail: {
String text;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(switch (fail) {
case CancelledByUser() => 'Cancelled',
case ServerError => 'Server Error',
// ...
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2625 次 |
| 最近记录: |