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].
试试这个
if let lastObject = dataArray.last{
print("dataArray.last != nil", + String(lastObject));
}else{
print("dataArray.last == nil );
}
first
和 last
数组的方法 return 可选值,包含 nil 或数组元素。展望未来,数组元素本身可以为 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");
}
数组有可选函数
last
可选(nil)不等于nil
如果你打印出 dataArray.last 那么 Optional(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
属性 做 return 一个包含 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
。
#1 条款
let lastOptional = dataArray.last
如果最后一个元素确实存在则成功。它将是一个 Int?
,因此一个包含 nil
或 Int
的可选值。在这两种情况下,该条款都得到满足。
Basically the first clause is satisfied when the array is NOT empty.
#2 子句
last = lastOptional
如果可选的最后一个 (Int?) 元素成功解包,则成功。
This clause is satisfied when the last element does exists and is not an Optional containing nil
.
总结
在 if
的正文中,您可以使用 last
并且您可以确定它将是展开后的值。事实上最后的类型是 Int
.
如其他答案中所述,last
属性
Element
的集合具有 Element?
类型,并且 returns 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?
,那么return类型
变成 Item??
.
我需要检查 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].
试试这个
if let lastObject = dataArray.last{
print("dataArray.last != nil", + String(lastObject));
}else{
print("dataArray.last == nil );
}
first
和 last
数组的方法 return 可选值,包含 nil 或数组元素。展望未来,数组元素本身可以为 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");
}
数组有可选函数
last
可选(nil)不等于nil
如果你打印出 dataArray.last 那么 Optional(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
属性 做 return 一个包含 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
。
#1 条款
let lastOptional = dataArray.last
如果最后一个元素确实存在则成功。它将是一个 Int?
,因此一个包含 nil
或 Int
的可选值。在这两种情况下,该条款都得到满足。
Basically the first clause is satisfied when the array is NOT empty.
#2 子句
last = lastOptional
如果可选的最后一个 (Int?) 元素成功解包,则成功。
This clause is satisfied when the last element does exists and is not an Optional containing
nil
.
总结
在 if
的正文中,您可以使用 last
并且您可以确定它将是展开后的值。事实上最后的类型是 Int
.
如其他答案中所述,last
属性
Element
的集合具有 Element?
类型,并且 returns 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?
,那么return类型
变成 Item??
.