首页 > 解决方案 > 检查数组是否可以在给定索引处具有元素的快速方法?

问题描述

为了防止潜在的崩溃,每当我尝试访问数组中的特定元素时,我通常都会进行一些安全检查。我只是意识到我有点厌倦了这样做。有没有办法快速安全地做到这一点?

var array:[String] = [/*Filled with stuff*/]
func someFunc(someIndex:Int){

    //This is unsafe. It will crash if index is negative or larger than count.
    let text = array[someIndex]

    //This is completely safe, but boring.
    let text:String
    if someIndex >= 0 && someIndex < array.count{
        text = array[someIndex] 
    }else { return }

    //What I want is something like this:
    let text = array.hasElement(at: someIndex) ? array[someIndex] : return
    //I know, I can't really put a 'return' in a statement like this, but I really want to..

    //Optimally, I'd like something like this:
    guard let text = array[someIndex] else { return }
    //But this is illegal because it's not an conditional binding with an optional type.
}

在写这篇文章时,我意识到我可能可以创建自己的扩展Sequence或其他东西,为func hasElement(at:Int)->Bool. 但我宁愿想要一种使用方式,guard因为我不能做内联condition ? true : return..

任何单线表示赞赏..

标签: iosarraysswift

解决方案


很简单,只需在 上进行扩展即可Collection

extension Collection {
    subscript(checked index: Index) -> Element? {
        if self.indices.contains(index) {
            return self[index]
        } else {
            return nil
        }
    }
}

所以:

let arr = ["Foo", "Bar", "Baz"]

print(arr[checked: 2]) // Optional("Baz")
print(arr[checked: 3]) // nil

如果这太多了,你可以只使用三元运算符:

let foo: String? = arr.indices.contains(3) ? arr[3] : nil

推荐阅读