如何快速且安全地判断数组指定索引是否可访问元素?
Swift数组安全访问的简便替代方案
兄弟,我太懂这种每次写数组索引安全检查都觉得啰嗦的心情了!不用再跟那些冗长的if someIndex >=0 && someIndex < array.count判断较劲,Swift有好几种既快捷又安全的办法能解决这个问题,我给你捋几个最实用的:
- 自定义安全下标扩展(最推荐!)
这是一劳永逸的做法,给Array写个扩展之后,整个项目里都能轻松用安全下标访问:
extension Array { subscript(safe index: Int) -> Element? { // 利用数组自带的indices属性判断索引是否合法 return indices.contains(index) ? self[index] : nil } }
之后用起来就超简洁,还能结合可选绑定或者默认值:
var array: [String] = ["a", "b", "c"] func someFunc(someIndex: Int) { // 可选绑定处理存在的元素 if let text = array[safe: someIndex] { print("拿到有效元素:\(text)") } else { print("索引无效,越界啦!") } // 或者直接给个默认值 let safeText = array[safe: someIndex] ?? "默认文本" }
- 用
indices简化安全判断
如果不想写扩展,也可以用数组自带的indices属性来替代手动的范围判断,代码会清爽很多:
func someFunc(someIndex: Int) { if array.indices.contains(someIndex) { let text = array[someIndex] // 处理有效元素 } else { // 处理索引越界情况 } }
array.indices会直接返回数组的合法索引范围(比如0..<array.count),比手动写>=0 && < array.count更简洁也更符合Swift的风格。
- 遍历场景用
enumerated()
如果你的需求是在遍历数组时定位特定索引的元素,enumerated()能同时拿到索引和元素,完全不用担心越界:
for (index, element) in array.enumerated() { if index == someIndex { print("找到目标元素:\(element)") break } }
不过这个更适合遍历场景,不是直接访问单个元素的最优解,但也是一种安全的思路。
内容的提问来源于stack exchange,提问作者Sti
相关产品推荐
相关产品推荐

