[英]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的first
和last
方法返回可選值,該值包含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?
,因此可能出現三種情況:
dataArray.last
為nil
aka .None
。 nil
: dataArray.last
為.Some(nil)
。 nil
: dataArray.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
屬性的確返回一個包含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
, if
必須同時滿足這兩個子句。
#1子句
let lastOptional = dataArray.last
如果最后一個元素確實存在,則不會成功。 會是Int?
因此包含nil
或Int
的可選值。 在這兩種情況下,該子句均得到滿足。
當數組不為空時,基本上滿足第一個子句。
#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.