Подтвердить что ты не робот

Как найти индекс элемента в Swift?

Есть ли метод, называемый indexof или что-то подобное?

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

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

Ответ 1

РЕДАКТИРОВАТЬ: Начиная с Swift 3.0, вы должны использовать метод .index(where:) и следовать приведенному ниже изменению Swift 2.0.

EDIT: с 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")
}

Ответ 2

В Swift 2.0 (Xcode 7.1b) вы можете использовать

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

while find(array, "Jason") устарел.

Ответ 3

Я сделал эту функцию, как указано выше, но возвращает массив индексов

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

Возможно, вам это будет полезно

Ответ 4

Массив может быть подключен к NSArray, поэтому вы можете использовать:

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

Ответ 5

Расширение массива может творить чудеса здесь. Здесь реализация разделяет в fooobar.com/questions/24910/...:

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

Ответ 6

Вы можете добавить расширение массива, которое делает именно то, что вы хотите, i.e:

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

Теперь вы можете использовать .indexOf() для всех массивов Swift, например:

["Jason", "Charles", "David"].indexOf("Jason")  //0

Ответ 7

В то время как ответ от 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, замените как! → как