如何在Swift中找到项目的索引?

时间:2014-06-08 10:47:08

标签: swift

是否有一种名为indexof或类似的方法?

var array = ["Jason", "Charles", "David"]

indexOf(array, "Jason") // Should return 0

7 个答案:

答案 0 :(得分:58)

编辑:从Swift 3.0开始,您应该使用.index(where:)方法,并按照下面的Swift 2.0编辑中的更改进行操作。

编辑:从Swift 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功能。它返回nil(如果找不到值)或数组中值的第一个索引。

if let i = find(array, "Jason") {
    println("Jason is at index \(i)")
} else {
    println("Jason isn't in the array")
}

答案 1 :(得分:14)

在Swift 2.0(Xcode 7.1b)中,您可以使用

if let result = array.indexOf("Jason")

find(array, "Jason")已被弃用。

答案 2 :(得分:8)

我像上面那样创建了这个函数,但它返回索引数组

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
    }
}

也许它会对你有用

答案 3 :(得分:1)

数组可以桥接到NSArray,因此您可以使用:

array.bridgeToObjectiveC().indexOfObject("Jason")

答案 4 :(得分:1)

Array的扩展可以在这里创造奇迹。以下是this StackOverflow answer中共享的实现:

extension Array {
  func find (includedElement: T -> Bool) -> Int? {
    for (idx, element) in enumerate(self) {
      if includedElement(element) {
        return idx
      }
    }
    return nil
  }
}

答案 5 :(得分:0)

您可以添加一个完全符合您要求的数组扩展,即:

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

答案 6 :(得分:0)

虽然Max的响应非常好,但它不允许您找到多个对象的多个索引,即。数组子集的索引。如果您需要该功能,扩展程序将一如既往地成为您最好的朋友

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兼容,请替换为! - &GT;如