如何优雅地使用后卫或如果让他们迅速

时间:2018-02-14 08:58:15

标签: swift

如何获取空列表中的第一项以使用guard letif 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
}

但是第二或第三项呢?

3 个答案:

答案 0 :(得分:1)

使用empty.first,返回T?

guard let first = empty.first else {
    // do something
}

请注意,guard语句的正文必须退出父作用域。听起来你的评论反过来(firstguard范围内为零,而不是在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 }