簡體   English   中英

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].

array的firstlast方法返回可選值,該值包含nil或array的元素。 展望未來,數組元素本身可以為零。 讓我舉個簡單的例子:

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

您認為lastElement是否具有String?類型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");
}

正如其他答案中所解釋的那樣, Element集合的last屬性的類型為Element? ,如果集合為空,則返回nil 在您的情況下,元素類型本身是可選類型Item? ,因此可能出現三種情況:

  1. 數組為空: dataArray.lastnil aka .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? ,則返回類型變為Item??

你為什么得到那個結果?

讓我們看一下這段代碼

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

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

它確實打印

nil

確實發生了,因為dataArray被定義為可選Int (也稱為Int? )的數組。 因此, last屬性的確返回一個包含nilOptional值。

因此,滿足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要解析為trueif必須同時滿足這兩個子句。

#1子句

let lastOptional = dataArray.last

如果最后一個元素確實存在,則不會成功。 會是Int? 因此包含nilInt的可選值。 在這兩種情況下,該子句均得到滿足。

當數組不為空時,基本上滿足第一個子句。

#2子句

last = lastOptional

如果成功解開了可選的last(Int?)元素,則不會成功。

當最后一個元素確實存在並且不是包含nil的Optional時,將滿足此子句。

包起來

if可以使用last ,則可以確保其內部為展開值。 實際上,last的類型是Int

嘗試這個

if let lastObject = dataArray.last{

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

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

數組具有可選功能

持續

可選(nil)不等於nil

如果您打印出dataArray.last,則將打印Optional(nil)

嘗試這個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM