我有一个dynamic x,我想分配x给T sif 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);
Run Code Online (Sandbox Code Playgroud)
有没有一种语法上更好的方法可以做到这一点?
Mat*_*Pag 15
我正在使用具有 Dart null 安全性的那些(Dart SDK >= 2.12):
T? castOrNull<T>(dynamic x) => x is T ? x : null;
T castOrFallback<T>(dynamic x, T fallback) => x is T ? x : fallback;
Run Code Online (Sandbox Code Playgroud)
Mag*_*s W 14
我使用以下实用程序函数,它允许可选的回退值和错误日志记录。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
var x = something();
String s = tryCast(x, fallback: 'nothing');
Run Code Online (Sandbox Code Playgroud)
dav*_*ady 13
只需使用as关键字
final tweet = tweets[index] as Tweet;
Run Code Online (Sandbox Code Playgroud)
这个隐藏的宝石是由 Dart-Lang 的维护者之一提供的:
extension AsExtension on Object? {
X as<X>() => this as X;
X? asOrNull<X>() {
var self = this;
return self is X ? self : null;
}
}
extension AsSubtypeExtension<X> on X {
Y asSubtype<Y extends X>() => this as Y;
}
extension AsNotNullExtension<X> on X? {
X asNotNull() => this as X;
}
// example
void main() {
num? n = 1 as dynamic;
n.as<int>().isEven;
n.asSubtype<int>().isEven; // `n.asSubtype<String>()` is an error.
n.asNotNull().floor();
n.asOrNull<int>()?.isEven; // Corresponds to `(n as? int)?.isEven`.
}
Run Code Online (Sandbox Code Playgroud)
注意:如果您的对象属于类型dynamic,则必须Object?先对其进行强制转换。对此的解释可以在这里找到:第一个由 dart 维护者 @Google Erik 提出,第二个由社区成员提出。基本上,它归结为 dart 不在接收以下三种类型之一时调用扩展方法:dynamic、Never或如此处void所述。
Dart 2具有通用功能,允许
T cast<T>(x) => x is T ? x : null;
Run Code Online (Sandbox Code Playgroud)
dynamic x = something();
String s = cast<String>(x);
Run Code Online (Sandbox Code Playgroud)
你也可以使用
var /* or final */ s = cast<String>(x);
Run Code Online (Sandbox Code Playgroud)
并String推断出s
前两个帖子的组合,没有日志记录。
未提供时,回退默认为 null。
T cast<T>(dynamic x, {T fallback}) => x is T ? x : fallback;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1614 次 |
| 最近记录: |