Я пытаюсь найти item index
путем поиска list
. Кто-нибудь знает, как это сделать?
Я вижу , есть list.StartIndex
и , list.EndIndex
но я хочу что - то вроде Питона list.index("text")
.
Поскольку swift в некоторых отношениях более функциональный, чем объектно-ориентированный (и массивы являются структурами, а не объектами), используйте функцию «find» для работы с массивом, которая возвращает необязательное значение, поэтому будьте готовы обработать нулевое значение:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
Обновление для Swift 2.0:
Старая find
функция больше не поддерживается в Swift 2.0!
С Swift 2.0 Array
получает возможность находить индекс элемента, используя функцию, определенную в расширении CollectionType
(которое Array
реализует):
let arr = ["a","b","c"]
let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil
Кроме того, поиск первого элемента в массиве, удовлетворяющего предикату, поддерживается другим расширением CollectionType
:
let arr2 = [1,2,3,4,5,6,7,8,9,10]
let indexOfFirstGreaterThanFive = arr2.indexOf({$0 > 5}) // 5
let indexOfFirstGreaterThanOneHundred = arr2.indexOf({$0 > 100}) // nil
Обратите внимание, что эти две функции возвращают необязательные значения, как find
и раньше.
Обновление для Swift 3.0:
Обратите внимание, что синтаксис indexOf изменился. Для предметов, соответствующих Equatable
вам, можно использовать:
let indexOfA = arr.index(of: "a")
Подробную документацию о методе можно найти по адресу https://developer.apple.com/reference/swift/array/1689674-index.
Для элементов массива, которые не соответствуют, Equatable
вам нужно использовать index(where:)
:
let index = cells.index(where: { (item) -> Bool in
item.foo == 42 // test if this is the item you're looking for
})
Обновление для Swift 4.2:
С Swift 4.2 index
больше не используется, но разделен на firstIndex
и lastIndex
для лучшего разъяснения. Таким образом, в зависимости от того, ищете ли вы первый или последний индекс элемента:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
indexOf
массив структур, которые вы определили сами, ваша структура должна соответствоватьEquatable
протоколу.ТЛ; др:
Для классов вы можете искать:
Полный ответ:
Я думаю, что стоит упомянуть, что со ссылочными типами (
class
) вы можете выполнить сравнение идентификаторов , и в этом случае вам просто нужно использовать===
оператор идентификации в закрытии предиката:Swift 5, Swift 4.2:
Обратите внимание, что приведенный выше синтаксис использует синтаксис замыкающих замыканий и эквивалентен:
Swift 4 / Swift 3 - функция, которая раньше вызывалась
index
Swift 2 - функция, которая раньше вызывалась
indexOf
* Обратите внимание на актуальный и полезный комментарий по paulbailey о
class
типах , которые реализуютEquatable
, где вы должны рассмотреть , следует ли вам сравнение с использованием===
( тождественный оператора) или==
( равенство оператора). Если вы решите сопоставить, используя==
, то вы можете просто использовать метод, предложенный другими (people.firstIndex(of: person1)
).источник
Person
реализованEquatable
протокол, это не будет необходимо.Binary operator '===' cannot be applied to operands of type '_' and 'Post'
,Post
моя структура ... какие - либо идеи?structs
(иenums
) являются типами значений, а не ссылочными типами. Только ссылочные типы (напримерclass
) имеют логику сравнения идентичности (===
). Посмотрите другие ответы о том, что делатьstructs
(в основном вы просто используетеarray.index(of: myStruct)
, убедившись, что типmyStruct
соответствуетEquatable
(==
)).Вы можете
filter
массив с замыканием:И вы можете посчитать массив:
Таким образом, вы можете определить , включает ли массив ваш элемент, комбинируя эти:
Если вы хотите найти позицию, я не вижу причудливого пути, но вы, безусловно, можете сделать это так:
РЕДАКТИРОВАТЬ
В то время как мы на это, для удовольствия упражнения давайте расширим
Array
иметьfind
метод:Теперь мы можем сделать это:
источник
Array
функцию, чтобы иметьfind
метод, который делает то, что вы хотите. Я еще не знаю, если это хорошая практика, но это аккуратный эксперимент.enumerate
чтобы он больше не применялся , но вы абсолютно правы.Swift 5
Example1
Example2
источник
Хотя
indexOf()
работает отлично, он возвращает только один индекс.Я искал элегантный способ получить массив индексов для элементов, которые удовлетворяют некоторому условию.
Вот как это можно сделать:
Свифт 3:
Свифт 2:
источник
Для пользовательского класса необходимо реализовать протокол Equatable.
источник
Обновление для Swift 2:
Свифт 1:
Если вы просто хотите проверить, содержится ли элемент в массиве, то есть просто получите логический индикатор, используйте
contains(sequence, element)
вместоfind(array, element)
:Смотрите пример ниже:
источник
в Swift 4.2
.index (где :) был изменен на .firstIndex (где :)
источник
Swift 4. Если ваш массив содержит элементы типа [String: AnyObject]. Таким образом, чтобы найти индекс элемента, используйте следующий код
Или если вы хотите найти индекс на основе ключа из словаря. Здесь массив содержит объекты класса Model, и я сопоставляю свойство id.
источник
Swift 2.1
Свифт 3
источник
let array
? Использованиеself
сомнительно также.В Swift 4 , если вы просматриваете свой массив DataModel, убедитесь, что ваша модель данных соответствует Equatable Protocol, реализуйте метод lhs = rhs и только тогда вы можете использовать «.index (of». Например,
А потом,
источник
В Swift 2 (с Xcode 7)
Array
включаетindexOf
метод, предоставляемыйCollectionType
протоколом. (На самом деле, дваindexOf
метода - один, который использует равенство для сопоставления аргумента, и другой, который использует замыкание.)До Swift 2 у родовых типов, таких как коллекции, не было способа предоставить методы для конкретных производных от них типов (например, массивов). Итак, в Swift 1.x «index of» является глобальной функцией ... И она также переименована, так что в Swift 1.x эта глобальная функция вызывается
find
.Также возможно (но не обязательно) использовать
indexOfObject
метод изNSArray
... или любого другого, более сложного метода поиска из Foundation, который не имеет эквивалентов в стандартной библиотеке Swift. Простоimport Foundation
(или другой модуль, который транзитивно импортирует Foundation), приведитеArray
к немуNSArray
, и вы сможете использовать множество методов поискаNSArray
.источник
Любое из этого решения работает для меня
Это решение у меня есть для Swift 4:
источник
Вы также можете использовать функциональную библиотеку Dollar для индексации массива как такового http://www.dollarswift.org/#indexof-indexof
источник
Если вы все еще работаете в Swift 1.x
тогда попробуй,
источник
Для SWIFT 3 вы можете использовать простую функцию
Это даст номер позиции, так что вы можете использовать как
Надеюсь быть полезным
источник
SWIFT 4
Допустим, вы хотите сохранить число из массива с именем cardButtons в cardNumber, вы можете сделать это следующим образом:
отправитель имя вашей кнопки
источник
Swift 4
Для справочных типов:
источник
В Swift 4/5 используйте «firstIndex» для поиска индекса.
источник
В случае, если у кого-то есть эта проблема
Просто сделай это
тогда
источник
За
(>= swift 4.0)
Это довольно просто. Рассмотрим следующий
Array
объект.Чтобы получить индекс элемента
rose
, все, что вам нужно сделать, это:Замечания:
Array.index(of:)
возвращаетOptional<Int>
.nil
подразумевает, что элемент не присутствует в массиве.Возможно, вы захотите принудительно развернуть возвращаемое значение или использовать,
if-let
чтобы обойти необязательное.источник
Просто используйте метод firstIndex.
источник