【发布时间】:2015-02-19 17:48:44
【问题描述】:
在 Objective-C 中,当我有一个数组时
NSArray *array;
我想检查它是否不为空,我总是这样做:
if (array.count > 0) {
NSLog(@"There are objects!");
} else {
NSLog(@"There are no objects...");
}
这样,就不需要检查是否array == nil,因为这种情况会导致代码陷入else的情况,以及非nil但空数组可以。
但是,在 Swift 中,我偶然发现了我有一个可选数组的情况:
var array: [Int]?
我无法弄清楚要使用哪个条件。我有一些选择,例如:
选项 A: 在相同条件下检查非nil 和空案例:
if array != nil && array!.count > 0 {
println("There are objects")
} else {
println("No objects")
}
选项 B: 使用 let 取消绑定数组:
if let unbindArray = array {
if (unbindArray.count > 0) {
println("There are objects!")
} else {
println("There are no objects...")
}
} else {
println("There are no objects...")
}
选项 C: 使用 Swift 提供的合并运算符:
if (array?.count ?? 0) > 0 {
println("There are objects")
} else {
println("No objects")
}
我不太喜欢 B 选项,因为我在两种情况下重复代码。但我不确定选项 A 和 C 是否正确,或者我应该使用任何其他方式。
我知道根据情况可以避免使用可选数组,但在某些情况下可能需要询问它是否为空。所以我想知道最简单的方法是什么。
编辑:
正如@vacawama 所指出的,这种简单的检查方法是有效的:
if array?.count > 0 {
println("There are objects")
} else {
println("No objects")
}
但是,我正在尝试仅当它是 nil 或为空时才想做一些特殊的事情,然后不管数组是否有元素都继续。所以我尝试了:
if array?.count == 0 {
println("There are no objects")
}
// Do something regardless whether the array has elements or not.
还有
if array?.isEmpty == true {
println("There are no objects")
}
// Do something regardless whether the array has elements or not.
但是,当数组为nil 时,它不会落入if 体内。这是因为,在这种情况下,array?.count == nil 和 array?.isEmpty == nil,所以表达式 array?.count == 0 和 array?.isEmpty == true 都计算为 false。
所以我想弄清楚是否有任何方法可以仅在一个条件下实现这一目标。
【问题讨论】:
-
您是否有理由将数组设为可选?对于表格视图和我使用非可选的东西,因为(就像你说的)nil 与没有对象相同,因此通过删除 nil 可以降低复杂性而不会丢失任何功能。
-
我认为选项
A是最易读的。这是你唯一应该关心的事情。