我如何在Swift中find一个项目的索引?
有没有一种叫做indexof或类似的方法?
var array = ["Jason", "Charles", "David"] indexOf(array, "Jason") // Should return 0
编辑:作为斯威夫特3.0,您应该使用.index(where:)
方法,并按照下面的Swift 2.0编辑中的更改。
编辑:作为斯威夫特2.0,您应该使用indexOf
方法。 它也返回nil
或它的论点的第一个索引。
if let i = array.indexOf("Jason") { print("Jason is at index \(i)") } else { print("Jason isn't in the array") }
使用find
function。 它返回nil
(如果没有find该值)或数组中第一个索引值。
if let i = find(array, "Jason") { println("Jason is at index \(i)") } else { println("Jason isn't in the array") }
在Swift 2.0(Xcode 7.1b)中,你可以使用
if let result = array.indexOf("Jason")
而find(array, "Jason")
已经被弃用了。
我做了如上所述的这个函数,但它返回索引数组
extension Array { func indexesOf<T : Equatable>(object:T) -> [Int] { var result: [Int] = [] for (index,obj) in enumerate(self) { if obj as T == object { result.append(index) } } return result } }
也许这对你有用
数组可以桥接到一个NSArray,所以你可以使用:
array.bridgeToObjectiveC().indexOfObject("Jason")
Array的扩展可以在这里创造奇迹。 下面是在这个StackOverflow答案共享的实现:
extension Array { func find (includedElement: T -> Bool) -> Int? { for (idx, element) in enumerate(self) { if includedElement(element) { return idx } } return nil } }
您可以添加一个数组扩展,它完全按照您的要求进行,即:
extension Array { func indexOf<T : Equatable>(x:T) -> Int? { for i in 0..self.count { if self[i] as T == x { return i } } return nil } }
现在可以在所有Swift数组上使用.indexOf()
,例如:
["Jason", "Charles", "David"].indexOf("Jason") //0
虽然Max的响应非常好,但它不会让您find多个对象的多个索引,即。 数组子集的索引。 如果你需要这个function,扩展是一如既往,你最好的朋友
func indexesOfSubset<T : Equatable>(objects : [T]) -> [Int] { // Create storage for filtered objectsand results var unusedObjects = objects var result : [Int] = [] // Enumerate through all objects in array for (index, obj) in enumerate(self) { // Enumerate again through all objects that has not been found for x in unusedObjects { // If we hit match, append result, remove it from usused objects if obj as! T == x { result.append(index) unusedObjects = unusedObjects.filter( { $0 != x } ) break } } } // Get results return result }
注意*:在Swift 1.2上工作,如果你想兼容1.1,则replace为! – > as