当前位置: 首页 > 面试题库 >

检查可选数组是否为空

汪栋
2023-03-14
问题内容

在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 ,因为我会在两种情况下重复执行代码。但是我不确定选项 AC 是否正确,还是应该使用其他任何方式。

我知道根据情况可以避免使用可选数组,但是在某些情况下,可能有必要询问它是否为空。所以我想知道最简单的方法是什么。

编辑:

正如@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 == 0array?.isEmpty == true都计算为false

因此,我试图找出是否还有一种方法可以仅通过一个条件来实现这一目标。


问题答案:

更新了Swift 3及更高版本的答案:

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

Swift 2.x的先前答案:

您可以简单地执行以下操作:

if array?.count > 0 {
    print("There are objects")
} else {
    print("No objects")
}

正如@Martin在注释中指出的那样,它使用func ><T : _Comparable>(lhs: T?, rhs: T?) -> Bool表示编译器将其包装0为,Int?以便可以与左侧进行比较,这是Int?由于可选的链接调用所致。

以类似的方式,您可以执行以下操作:

if array?.isEmpty == false {
    print("There are objects")
} else {
    print("No objects")
}

注意:您必须与false此处明确比较才能正常工作。

如果要在数组nil为空或为空时执行某些操作,则至少有7个选择:

选项A:

if !(array?.count > 0) {
    print("There are no objects")
}

选项B:

if !(array?.isEmpty == false) {
    print("There are no objects")
}

选项C:

if array == nil || array!.count == 0 {
    print("There are no objects")
}

选项D:

if array == nil || array!.isEmpty {
    print("There are no objects")
}

选项E:

if (array ?? []).isEmpty {
    print("There are no objects")
}

选项F:

if array?.isEmpty ?? true {
    print("There are no objects")
}

选项G:

if (array?.count ?? 0) == 0 {
    print("There are no objects")
}

选项D 准确地记录了您用英语描述的方式: “我只想在nil或为空时做一些特别的事情。”
我建议您使用它,因为它很容易理解。这没有什么错,特别是因为如果变量为,它将“短路”并跳过对空的检查nil



 类似资料:
  • 当页面第一次加载时,我需要检查中是否有图像,并加载最后一个图像。 否则,我禁用预览按钮,提醒用户按下新图像按钮,并创建一个空数组来放置图像; 问题是中的

  • 问题内容: 检查数组是 原始值的平面数组 还是 多维数组 的最有效方法是什么? 没有实际循环遍历数组并在其每个元素上运行的方法,有没有办法做到这一点? 问题答案: 简短的答案是,如果“第二维”可能在任何地方,您都必须至少隐式​​循环才能做到。如果必须在第一项中,您只需 但是,我能找到的最有效的通用方法是在数组上使用一个foreach循环,每当找到一个命中点时就会短路(至少隐式循环比直接的for()

  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。

  • 问题内容: 我有一个没有元素的数组,我正在尝试检查它是否为空。 例如,为什么下面代码中的if语句的条件永远不会为真? 问题答案: 数组和空数组之间有一个关键的区别。这是对的测试null。 “Empty”在这里没有官方含义。我选择将空定义为具有0个元素: 如果所有元素都是,则“空”的另一种定义是: 要么

  • 问题内容: 如何检查numpy数组是否为空? 我使用了以下代码,但是如果数组包含零,则此操作将失败。 这是解决方案吗? 问题答案: 您可以随时查看属性。它定义为一个整数,并且在数组中没有元素时为零():

  • 问题内容: AngularJs中的内联方法是否可以检查某物是否为数组? 我本以为这样可以工作: 我已经证实它实际上是一个数组。有什么我想念的东西吗? 问题答案: 您可以戴上瞄准镜… 小提琴