如何获取空列表中的第一项以使用guard let
或if let
。
例如,我有一个空列表,我希望优先获得列表中的第一项,就像这里一样,但它看起来像:
var empty_array: [Int] = []
guard let first = empty[0] as? Int else{
// do something
}
// after operation first should be nil
我的代码崩溃,因为第一项错过了列表,我想获得第一项的结果为零。怎么做?
更新:获得第一项需求
guard let first = empty.first as? Int else{
// do something
}
但是第二或第三项呢?
答案 0 :(得分:1)
使用empty.first
,返回T?
。
guard let first = empty.first else {
// do something
}
请注意,guard
语句的正文必须退出父作用域。听起来你的评论反过来(first
在guard
范围内为零,而不是在import pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://abc:xxxxxx@localhost:27017')
范围之后。
答案 1 :(得分:1)
你可以
var empty: [Int] = []
guard let first = empty.first else {
// cast did fail - do any stuff to escape this func or whatever you would like to do
}
// access first here --> first is not nil
或
var empty: [Int] = []
if let first = empty.first {
// access first here --> first is not nil
} else {
// cast did fail - do stuff
}
答案 2 :(得分:0)
崩溃的原因是因为使用下标从数组中获取元素不会返回可选项。如果索引中不存在任何元素,它只会在索引超出范围时崩溃。这与下标访问返回可选的字典形成对比。这个设计决策背后的基本原理是,对于数组,每次展开可选项都是一个正确的痛苦,特别是你要做的就是测试索引是0 ..< array.count
。
您的guard语句尝试访问不存在的数组元素,因此崩溃。此外,你的警卫声明是错误的方式。 else之后的块是在异常条件下执行的。
因此,如果您使用 返回可选项的empty_array.first
,您应该这样做:
guard let first = empty_array.first else { return /* bail out of the function */ }
doSomething(with: first) // first is unwrapped here.
或者使用if
if let first = empty_array.first
{
doSomething(with: first) // first is unwrapped here.
}
或者您可以测试索引以确保它在范围内。具有使用任何索引的优势,而不仅仅是零
let index = // Some integer
guard index >= 0 && index < empty_array.count else { return }
doSomething(with: empty_array[index])
或者
guard (0 ..< empty_array.count).contains(index) else { return }