Swift数组 – 检查索引是否存在

在Swift中,是否有任何方法来检查索引是否存在于数组中,而不会引发致命错误?

我希望我能做这样的事情:

let arr: [String] = ["foo", "bar"] let str: String? = arr[1] if let str2 = arr[2] as String? { // this wouldn't run println(str2) } else { // this would be run } 

但是我明白了

致命错误:数组索引超出范围

Swift中一个优雅的方式:

 let isIndexValid = array.indices.contains(index) 

只要检查索引是否小于数组大小:

 if 2 < arr.count { ... } else { ... } 

Swift 3&4扩展:

 extension Collection { subscript(optional i: Index) -> Iterator.Element? { return self.indices.contains(i) ? self[i] : nil } } 

使用这个你可以得到一个可选的值,当向你的索引添加可选的关键字,这意味着即使索引超出范围,你的程序也不会崩溃。 在你的例子中:

 let arr = ["foo", "bar"] let str1 = arr[optional: 1] // --> str1 is now Optional("bar") if let str2 = arr[optional: 2] { print(str2) // --> this still wouldn't run } else { print("No string found at that index") // --> this would be printed } 

添加一些延伸糖:

 extension Collection { subscript(safe index: Index) -> Iterator.Element? { guard indices.contains(index) else { return nil } return self[index] } } if let item = [a,b,c,d][safe:3] {print(item)}//Output: c 

if let风格编码与数组一起使用,可以提高可读性

你可以用更安全的方式重写这个来检查数组的大小,并使用三元条件:

 if let str2 = (arr.count > 2 ? arr[2] : nil) as String?