Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-如何检查var是否为零?_Ios_Swift_Swift2_Ios9 - Fatal编程技术网

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

Ios Swift-如何检查var是否为零?,ios,swift,swift2,ios9,Ios,Swift,Swift2,Ios9,我需要检查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)

我需要检查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条件,最后一个元素还是为零。这怎么可能

此外,如果我打印
String(dataArray)
将返回以下内容:

[itemData,itemData , itemData , nil ,  nil , nil].
试试这个

if let lastObject = dataArray.last{

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

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

first
last
数组方法返回可选值,该值包含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");
}

数组具有可选功能

最后

可选(nil)不等于nil

如果打印出dataArray.last,则将打印可选(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
属性确实返回一个包含
nil
可选值

因此满足
if
子句,并执行
if
的主体

这是正确的语法 输出:

dataArray.last != nil, last = 3
解释 让我们看看
if
。它由两个子句组成,必须满足这两个条件才能将
if
解析为
true

第1条

let lastOptional = dataArray.last
last = lastOptional
如果最后一个元素确实存在,则不会成功。它将是一个
Int?
,因此可选值包含
nil
Int
。在这两种情况下,均满足本条款的要求

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

第2条

let lastOptional = dataArray.last
last = lastOptional
如果可选的最后一个(Int?)元素成功展开,则是否成功

当最后一个元素不存在且不是包含
nil
的可选元素时,满足此子句

收尾
if
的主体内,您可以使用
last
,并且可以确保它将是未包装的值。事实上,last的类型是
Int

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

  • 数组为空:
    dataArray.last
    nil
    aka
    .None
  • 数组不是空的,最后一个元素是
    nil
    dataArray.last
    。有些(无)
  • 数组不是空的,最后一个元素不是
    nil
    dataArray.last
    .Some(.Some(元素)
  • 如果你想区分这三个箱子,你必须打开包装 两次:

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

    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")
    }
    
    if case let element?? = dataArray.last {
        print("Last element is", element)
    } else {
        print("Last element is nil, or array is empty")
    }
    
    如果您只对数组的最后一个元素不是
    nil
    感兴趣, 然后,您可以将
    if case
    与可选模式一起使用:

    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")
    }
    
    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]
            }
        }
    }
    
    如果元素类型是可选的
    项?
    ,则返回类型为

    变成
    项???

    这意味着您有一个选项数组,请与字典值比较类似的问题。
    如果let last=dataArray.last其中last==nil{print(“last is nil”)}
    “试试这个”没有任何解释的答案并没有真正的帮助。可能是因为语法通常是
    如果let=…
    ,而不是
    如果var
    guard
    语句也可以用在这种情况下。@MartinR我写了这个答案,因为如果它起作用,我会向他解释它发生的原因和正确的答案答:请不要在没有任何真正理由的情况下否决投票。@AhmadIshfaq:我试图解释这不是一个好的答案,但我还没有投票。(不要假设没有任何真正理由的投票!我的答案是第一,对不起=)你是对的!第二种方法编辑正确谢谢:)@SwiftyCruz:如果数组为空,您的第一个被剪断的代码将崩溃。@appzYourLife编写的第一个代码与编写者的代码相比变化最小,第二个是准确的:)@SwiftyCruz:但您确实编写了
    尝试了这个
    ,但它不会编译。请修正您的答案。您已解释了问题发生的原因,但您的代码与问题中的代码相同,并产生相同的输出。@MartinR您是对的,谢谢您的指点。回答已更正您使用的是
    if let
    有条件地将
    dataArray.last
    赋值给
    lastElement
    ,但在if语句体中使用的是
    dataArray.last
    而不是
    lastElement
    ,因此,如果
    if let
    statement@AMomchilov在这个问题的背景下,你们不应该在意它。我特别对代码做了最小的更改:我让未命名的var
    \uu
    和unwrapped
    dataArray.last
    ,它将输出有关加倍可选类型的可视信息。您的示例不是一个可选数组(如问题中所述)。感谢您的回答,但我只想让您知道我声明了dataArray:[itemData!]。这与dataArray:[itemData?]martin!不同吗!,非常感谢,这很有帮助,但是你能告诉我最后一个函数是如何实现的吗。我只是想知道如何返回optiona(无)。Thanks@david字体我有