有没有想过为什么 Swift 在以错误的方式访问集合时会崩溃?特别是数组? 我也有过这种疑问,这里有一些扩展可以解决这个问题。🎉
此下标在无效输入时会优雅地失败,返回 nil
或拒绝修改集合。 对于有效输入,它的行为与 Swift 内置下标完全一样!
import SafeCollectionAccess
var first5Fibonacci = [1, 1, 2, 3, 5]
first5Fibonacci[orNil: 0] // Optional(1)
first5Fibonacci[orNil: 3] == first5Fibonacci[3] // true
first5Fibonacci[orNil: 999] // `nil`
first5Fibonacci[orNil: -1] // `nil`
first5Fibonacci[orNil: 2...4] // Optional([2, 4])
first5Fibonacci[orNil: -2...2] // `nil`
first5Fibonacci[orNil: ..<42] // `nil`
first5Fibonacci[orNil: 1] = 42 // [1, 42, 2, 3, 5]
first5Fibonacci[orNil: 999] = -1 // [1, 42, 2, 3, 5]
first5Fibonacci[orNil: -1] = 777 // [1, 42, 2, 3, 5]
first5Fibonacci[orNil: 0...2] = [9, 5] // [9, 5, 3, 5]
first5Fibonacci[orNil: -2...2] = [42] // [9, 5, 3, 5]
first5Fibonacci[orNil: ..<42] = [7, 7, 7] // [9, 5, 3, 5]
此下标在无效输入时会优雅地失败,返回或修改最接近的有效元素(或者,对于空集合,返回 nil
或拒绝修改)。 对于有效输入,它的行为与 Swift 内置下标完全一样!
import SafeCollectionAccess
var first5Fibonacci = [1, 1, 2, 3, 5]
first5Fibonacci[clamping: 0] // 1
first5Fibonacci[clamping: 3] == first5Fibonacci[3] // true
first5Fibonacci[clamping: 999] // 5
first5Fibonacci[clamping: -1] // 1
first5Fibonacci[clamping: 1] = 42 // [1, 42, 2, 3, 5]
first5Fibonacci[clamping: 999] = -1 // [1, 42, 2, 3, -1]
first5Fibonacci[clamping: -1] = 777 // [777, 42, 2, 3, -1]