ios - 检查数组是否可以在给定索引处具有元素的快速方法?
问题描述
为了防止潜在的崩溃,每当我尝试访问数组中的特定元素时,我通常都会进行一些安全检查。我只是意识到我有点厌倦了这样做。有没有办法快速安全地做到这一点?
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
..
任何单线表示赞赏..
解决方案
很简单,只需在 上进行扩展即可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
推荐阅读
- python - 如何使用 numba njit 在 n dim 向量中将 np.nan 替换为 0?
- java - 导入 org 包时出错 - 可从多个模块访问
- batch-file - 更改文本文件中的某些列,其余列将使用批处理脚本保留
- mongoose - 具有必需属性和混合属性的 Mongoose 模式
- reactjs - 防止 Material UI Typography Text 超出其父级
- c# - 如何在 C# 中按 ID 对 JSON 数据进行分组
- vue.js - 使用 Vue /Ajax 的 Shopify 客户登录表单
- python - 如何使函数将间隔拆分为“n”个子间隔?
- python - 为什么 SystemButtonFace 在 linux 中没有作为颜色接收,但在使用 tkinter 时在 windows 中接收?
- r - 如何使用 ggplot 为我的线性混合模型正确设置图例?