刚开始使用原生iOS背景的Flutter,所以我只是有一个关于Dart beta null安全性的快速问题。
所以在Swift中,因为他们从一开始就有null安全的想法,就像Kotlin一样,有两个我非常喜欢的特性是if let
和guard let
。这两点使得处理可选值变得容易得多。我不确定测试版的Dart是否有类似的功能。
我不是Swift的专家,但是Dart会使用null检查来自动提升类型,我认为这主要是if let
和guard 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