相当于Dart中Swift的if let和guard let



刚开始使用原生iOS背景的Flutter,所以我只是有一个关于Dart beta null安全性的快速问题。

所以在Swift中,因为他们从一开始就有null安全的想法,就像Kotlin一样,有两个我非常喜欢的特性是if letguard let。这两点使得处理可选值变得容易得多。我不确定测试版的Dart是否有类似的功能。

感谢

我不是Swift的专家,但是Dart会使用null检查来自动提升类型,我认为这主要是if letguard let的工作。

例如:

String? x = possiblyReturnsNull();
if (x != null) {
// All code within this block treats `x` as non-nullable.
}
// All code outside the block continues to treat `x` as nullable.

注意,提升不会在非局部变量上执行,所以对于那些你需要显式引入一个局部引用的变量。(有一种语言建议提供一种机制,允许更好的机制添加局部引用而不污染外部作用域。)

我要跳进去,因为我也来自Swift并且喜欢使用很多guard。再加上@jamesdlin所说的,反过来也是正确的。

所以你可以在功能上执行Swift guard语句:

String? x = possiblyReturnsNull();
if (x == null) return whatever; // This works like Swift's guard
// All code outside the block now treats `x` as NON-nullable.

对公认答案的一个小扩展是,Flutter还允许强制展开Optional。所以如果你访问的是非空值没有保存在变量中,比如字典中,你需要在if语句中打开它:

if (someDict[someKey] != null) {
print(someDict[someKey]!)
}
//

扑动3.x

处理这个问题的一个快速方法是在String?上扩展null和空

extension NullEmptyCheck on String? {
bool notNullOrEmpty() => (this != null && this!.isNotEmpty);
}

由于null检查首先发生,因此强制打开第二个this

是安全的。用法:

if (myOptionalStr.notNullOrEmpty()) {
// value is safe to force unwrap
print(myOptionalStr!);
}

如果您只是想用值或空String展开可选内容,那么您可以这样做

extension Unwrapped on String? {
String unwrapped() => this != null ? this! : '';
}

返回未包装的值或空的String

都可以是通用的,但是你需要为后者传递一个默认值,你必须确保它在所有情况下都能工作

检查Dart中的null安全性:

value ?? 0

最新更新