在Objective-C中,当我有一个数组时
NSArray *array;
我想检查它是否不为空,我总是这样做:
if (array.count > 0) { NSLog(@"There are objects!"); } else { NSLog(@"There are no objects..."); }
这样一来,无需检查是否会array == nil因为这种情况将导致代码陷入错误else,并且非nil空数组也会这样做。
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:
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.
但是,当array为时nil,它不会掉入if体内。这是因为在这种情况下,array?.count == niland array?.isEmpty == nil,因此表达式array?.count == 0和array?.isEmpty == true都计算为false。
if
array?.count == nil
array?.isEmpty == nil
array?.count == 0
array?.isEmpty == true
false
因此,我试图找出是否还有一种方法可以仅通过一个条件来实现这一目标。
Swift 3删除了与>和比较可选选项的功能<,因此先前答案的某些部分不再有效。
>
<
仍然可以将可选参数与进行比较==,因此检查可选数组是否包含值的最直接方法是:
==
if array?.isEmpty == false { print("There are objects!") }
其他可以完成的方式:
if array?.count ?? 0 > 0 { print("There are objects!") } if !(array?.isEmpty ?? true) { print("There are objects!") } if array != nil && !array!.isEmpty { print("There are objects!") } if array != nil && array!.count > 0 { print("There are objects!") } if !(array ?? []).isEmpty { print("There are objects!") } if (array ?? []).count > 0 { print("There are objects!") } if let array = array, array.count > 0 { print("There are objects!") } if let array = array, !array.isEmpty { print("There are objects!") }
如果要在数组nil为空或为空时执行某些操作,则至少有6个选择:
选项A:
if !(array?.isEmpty == false) { print("There are no objects") }
选项B:
if array == nil || array!.count == 0 { print("There are no objects") }
选项C:
if array == nil || array!.isEmpty { print("There are no objects") }
选项D:
if (array ?? []).isEmpty { print("There are no objects") }
选项E:
if array?.isEmpty ?? true { print("There are no objects") }
选项F:
if (array?.count ?? 0) == 0 { print("There are no objects") }
选项C 恰好记录了您用英语描述的方式: “我只想在nil或为空时做一些特别的事情。” 我建议您使用它,因为它很容易理解。这没有什么错,特别是因为如果变量为,它将“短路”并跳过对空的检查nil。
您可以简单地执行以下操作:
if array?.count > 0 { print("There are objects") } else { print("No objects") }
正如@Martin在注释中指出的那样,它使用func ><T : _Comparable>(lhs: T?, rhs: T?) -> Bool表示编译器将其包装0为,Int?以便可以与左侧进行比较,这是Int?由于可选的链接调用所致。
func ><T : _Comparable>(lhs: T?, rhs: T?) -> Bool
0
Int?
以类似的方式,您可以执行以下操作:
if array?.isEmpty == false { print("There are objects") } else { print("No objects") }
注意:您必须与false此处明确比较才能正常工作。
如果要在数组nil为空或为空时执行某些操作,则至少有7个选择:
if !(array?.count > 0) { print("There are no objects") }
选项G:
选项D 准确地记录了您用英语描述的方式: “我只想在nil或为空时做一些特别的事情。” 我建议您使用它,因为它很容易理解。这没有什么错,特别是因为如果变量为,它将“短路”并跳过对空的检查nil。