
在线上的 bug 中,有一大部分比例是由数组越界导致的,因为直接通过下标从数组中取值时,一不小心就会越界,导致 crash,今天讲讲如何防止这种情况发生。
方法一、通过下标取值时手动判断防止越界
let arr = [1, 2, 3, 4, 5]
if index >= 0 && index < arr.count {
// 安全取值
let item = arr[index]
} else {
// 捕获错误
}
也可以通过 guard 关键字提前退出,这样代码会更容易理解:
let arr = [1, 2, 3, 4, 5]
guard index >= 0 && index < arr.count else {
// 捕获错误
return
}
// 安全取值
let item = arr[index]
方法二、自定义数组扩展方法,让下标取到的值变为可选
extension Array {
subscript(safe index: Index) -> Element? {
indices.contains(index) ? self[index] : nil
}
}
取值之前会先判断是否越界,如果越界,则返回 nil。使用的时候可以这样写:
let arr = [1, 2, 3, 4, 5]
if let item = arr[safe: index] {
// 安全取值
} else {
// 捕获错误
}
扩展方法也可以这样实现:
extension Array {
public func safeObject(at index: Int) -> Element? {
indices.contains(index) ? self[index] : nil
}
}
方法三
我们还可以稍微改一下代码,为了及时发现并解决问题,在 Debug 期间把错误抛出,在 Release 下保证不要 crash:
func safe(_ index: Int) -> Element? {
guard index >= 0, index < count else {
#if DEBUG
fatalError("数组越界啦")
#else
return nil
#endif
}
return self[index]
}
点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识
本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!