Ios Swift-如何检查var是否为零?
我需要检查dataArray中的最后一个元素是否为nil,因此我正在运行以下代码: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)
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
和unwrappeddataArray.last
,它将输出有关加倍可选类型的可视信息。您的示例不是一个可选数组(如问题中所述)。感谢您的回答,但我只想让您知道我声明了dataArray:[itemData!]。这与dataArray:[itemData?]martin!不同吗!,非常感谢,这很有帮助,但是你能告诉我最后一个函数是如何实现的吗。我只是想知道如何返回optiona(无)。Thanks@david字体我有