我需要检查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)
答案 0 :(得分:4)
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");
}
答案 1 :(得分:4)
正如其他答案中所解释的那样,a的last
属性
Element
的集合的类型为Element?
,并返回nil
如果集合是空的。在您的情况下,元素类型本身是
可选类型Item?
,因此有三种情况可能:
dataArray.last
为nil
又名.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??
。
答案 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");
}