Swift - 如何检查 var 是否为 nil?

Swift - How to check if var is nil?

我需要检查 dataArray 中的最后一个元素是否为 nil,所以我 运行 这段代码:

 if(dataArray.last == nil){
     print("dataArray.last == nil");
 } else {
     print("dataArray.last != nil , last = " + String(dataArray.last));
 }

奇怪的是它正在打印这个:

dataArray.last != nil , last = Optional(nil)

表示尽管不满足 if 条件,但最后一个元素为 nil。这怎么可能?

此外,如果我打印 String(dataArray) 这就是返回的内容:

[itemData,itemData , itemData , nil ,  nil , nil].

试试这个

if let lastObject = dataArray.last{

            print("dataArray.last != nil", + String(lastObject));
        }else{

            print("dataArray.last == nil );
        }

firstlast 数组的方法 return 可选值,包含 nil 或数组元素。展望未来,数组元素本身可以为 nil。让我举个简单的例子:

let dataArray: [String?] = ["a", nil]
let lastElement = dataArray.last

您认为 lastElement 的类型是 String?,但它的类型是 String??。当你检查 dataArray.last 是否为 nil 时,你只是确认数组不为空。我建议您改为使用可选绑定:

if let lastElement = dataArray.last, _ = lastElement{         
    print("dataArray.last != nil , last = " + String(dataArray.last));        
}else{
    print("dataArray is empty OR last element of dataArray is nil");
}

数组有可选函数

last

可选(nil)不等于nil

如果你打印出 dataArray.last 那么 Optional(nil) 将被打印出来

试试这个

if let _ = dataArray.last {
     print("dataArray.last != nil , last = " + String(dataArray.last));
}else{
     print("dataArray.last == nil");
}

你为什么得到那个结果?

让我们看看这段代码

let dataArray: [Int?] = [1, nil]

if let last = dataArray.last {
    print(last)
}

确实打印

nil

它确实发生了,因为 dataArray 被定义为可选 Int(也称为 Int?)的数组。所以 last 属性 做 return 一个包含 nil.

Optional

所以 if 子句得到满足, if 的主体被执行。

这是正确的语法

let dataArray: [Int?] = [1, nil ,3]

if let lastOptional = dataArray.last, last = lastOptional {
    print("dataArray.last != nil, last = \(last)")
} else {
    print("dataArray.last == nil")
}

输出:

dataArray.last != nil, last = 3

说明

让我们看看if。它由 2 个子句组成,必须满足两个子句才能将 if 解析为 true

#1 条款

let lastOptional = dataArray.last

如果最后一个元素确实存在则成功。它将是一个 Int?,因此一个包含 nilInt 的可选值。在这两种情况下,该条款都得到满足。

Basically the first clause is satisfied when the array is NOT empty.

#2 子句

last = lastOptional

如果可选的最后一个 (Int?) 元素成功解包,则成功。

This clause is satisfied when the last element does exists and is not an Optional containing nil.

总结

if 的正文中,您可以使用 last 并且您可以确定它将是展开后的值。事实上最后的类型是 Int.

如其他答案中所述,last 属性 Element 的集合具有 Element? 类型,并且 returns nil 如果集合为空。在您的情况下,元素类型本身是 可选类型 Item?,因此可能存在三种情况:

  1. 数组为空:dataArray.lastnil 又名 .None
  2. 数组不为空,最后一个元素为nildataArray.last.Some(nil).
  3. 数组不为空,最后一个元素不是nildataArray.last.Some(.Some(element).

如果你想区分这三种情况,你必须展开 两次:

let dataArray: [String?] = [ "a", "b", "c", nil ] // As an example

if let lastElement = dataArray.last {
    if let lastUnwrapped = lastElement {
        print("Last element is", lastUnwrapped)
    } else {
        print("Last element is nil")
    }
} else {
    print("Array is empty")
}

这可以用开关和可选模式短接:

switch dataArray.last {
case let element??:
    print("Last element is", element)
case let element?:
    print("Last element is nil")
case nil:
    print("Array is empty")
}

如果您只对数组的最后一个元素不是 nil 感兴趣, 那么您可以使用 if case 和可选模式:

if case let element?? = dataArray.last {
    print("Last element is", element)
} else {
    print("Last element is nil, or array is empty")
}

这里 element??.Some(.Some(element)) 的快捷方式 匹配案例 #3。


如果你想为数组重新实现 last 方法,那么它 只是

extension Array {
    func lastMe() -> Element? {
        if isEmpty {
            return nil
        } else {
            return self[count - 1]
        }
    }
}

如果元素类型是可选的Item?,那么return类型 变成 Item??.