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

时间:2016-06-20 11:16:34

标签: ios swift swift2 ios9

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

window.location.href

奇怪的是它打印了这个:

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

尽管没有达到if条件,但最后一个元素是nil。这怎么可能?

此外,如果我打印dataArray.last != nil , last = Optional(nil) ,这就是返回的内容:

String(dataArray)

5 个答案:

答案 0 :(得分:4)

数组的

firstlast方法返回可选值,包含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");
}

答案 1 :(得分:4)

正如其他答案中所解释的那样,a的last属性 Element的集合的类型为Element?,并返回nil 如果集合是空的。在您的情况下,元素类型本身是 可选类型Item?,因此有三种情况可能:

  1. 数组为空:dataArray.lastnil又名.None
  2. 数组不为空,最后一个元素为nildataArray.last.Some(nil)
  3. 数组不为空,最后一个元素不是nildataArray.last.Some(.Some(element)
  4. 如果你想区分这三种情况,你必须打开包装 两次:

    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?,则返回类型 变为Item??

答案 2 :(得分:2)

你为什么得到那个结果?

让我们看看这段代码

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

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

打印

nil

确实发生了,因为dataArray被定义为可选Int(又名Int?)的数组。因此,last属性确实返回包含Optional的{​​{1}}值。

因此满足nil子句并执行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 。它由2个子句组成,必须满足if才能将其解析为if

#1条款

true
如果最后一个元素存在,

会成功。它将是let lastOptional = dataArray.last ,因此是包含Int?nil的可选值。在这两种情况下,该条款都得到满足。

  

当数组 NOT 为空时,基本上满足第一个子句。

#2条款

Int
如果成功解包了可选的last(Int?)元素,

会成功。

  

当最后一个元素存在且不是包含last = lastOptional 的可选项时,该子句得到满足。

收转

nil的正文中你可以使用if,你可以确定它将是未包装的值。事实上,最后的类型是last

答案 3 :(得分:0)

试试这个

if let lastObject = dataArray.last{

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

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

答案 4 :(得分:0)

数组具有可选功能

  

最后

可选(nil)不等于nil

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

试试这个

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