Estou tentando encontrar um item index
pesquisando um list
. alguém sabe como fazer aquilo?
Eu vejo que existe list.StartIndex
e list.EndIndex
quero algo como o de python list.index("text")
.
Como o swift é, em alguns aspectos, mais funcional do que o orientado a objetos (e Arrays são estruturas, não objetos), use a função "find" para operar na matriz, que retorna um valor opcional, portanto, esteja preparado para lidar com um valor nulo:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
Atualização para o Swift 2.0:
A find
função antiga não é mais suportada no Swift 2.0!
Com o Swift 2.0, Array
obtém a capacidade de encontrar o índice de um elemento usando uma função definida em uma extensão de CollectionType
(que Array
implementa):
let arr = ["a","b","c"]
let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil
Além disso, a localização do primeiro elemento em uma matriz que cumpre um predicado é suportada por outra extensão de 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
Observe que essas duas funções retornam valores opcionais, como find
antes.
Atualização para o Swift 3.0:
Observe que a sintaxe de indexOf foi alterada. Para itens em conformidade com Equatable
você, você pode usar:
let indexOfA = arr.index(of: "a")
Uma documentação detalhada do método pode ser encontrada em https://developer.apple.com/reference/swift/array/1689674-index
Para itens de matriz que não estão em conformidade, Equatable
você precisará usar index(where:)
:
let index = cells.index(where: { (item) -> Bool in
item.foo == 42 // test if this is the item you're looking for
})
Atualização para o Swift 4.2:
Com o Swift 4.2, index
não é mais usado, mas é separado firstIndex
e lastIndex
para melhor esclarecimento. Portanto, dependendo de você estar procurando o primeiro ou o último índice do item:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
indexOf
um conjunto de estruturas que você mesmo definiu, sua estrutura deve estar em conformidade com oEquatable
protocolo.tl; dr:
Para as aulas, você pode estar procurando:
Resposta completa:
Eu acho que vale a pena mencionar que, com os tipos de referência (
class
), você pode querer fazer uma comparação de identidade ; nesse caso, você só precisa usar o===
operador de identidade no fechamento do predicado:Swift 5, Swift 4.2:
Observe que a sintaxe acima usa a sintaxe de fechamento à direita e é equivalente a:
Swift 4 / Swift 3 - a função costumava ser chamada
index
Swift 2 - a função costumava ser chamada
indexOf
* Observe o comentário relevante e útil de paulbailey sobre os
class
tipos implementadosEquatable
, nos quais é necessário considerar se você deve comparar usando===
( operador de identidade ) ou==
( operador de igualdade ). Se você decidir combinar o uso==
, poderá simplesmente usar o método sugerido por outras pessoas (people.firstIndex(of: person1)
).fonte
Person
implementado oEquatable
protocolo, isso não seria necessário.Binary operator '===' cannot be applied to operands of type '_' and 'Post'
,Post
é o meu struct ... alguma idéia?structs
(eenums
) são tipos de valor, não tipos de referência. Somente tipos de referência (por exemploclass
) possuem lógica de comparação de identidade (===
). Confira as outras respostas sobre o que fazerstructs
(basicamente você simplesmente usa oarray.index(of: myStruct)
, certificando-se de que o tipomyStruct
está em conformidade comEquatable
(==
)).Você pode
filter
uma matriz com um fechamento:E você pode contar uma matriz:
Portanto, você pode determinar se uma matriz inclui seu elemento combinando estes:
Se você deseja encontrar a posição, não vejo uma maneira elegante, mas certamente você pode fazê-lo assim:
EDITAR
Enquanto estamos nisso, para um exercício divertido, vamos estender
Array
para ter umfind
método:Agora podemos fazer isso:
fonte
Array
para ter umfind
método que faça o que você deseja. Ainda não sei se essa é uma boa prática, mas é uma experiência interessante.enumerate
lo, para que não se aplique mais, mas você está absolutamente certo.Swift 5
Exemplo 1
Exemplo2
fonte
Enquanto
indexOf()
funciona perfeitamente, ele retorna apenas um índice.Eu estava procurando uma maneira elegante de obter uma matriz de índices para elementos que satisfazem alguma condição.
Aqui está como isso pode ser feito:
Swift 3:
Swift 2:
fonte
Para classe personalizada, você precisa implementar o protocolo Equatable.
fonte
Atualização para o Swift 2:
Swift 1:
Se você está olhando apenas para verificar se um elemento está contido em uma matriz, ou seja, obtenha um indicador booleano, use em
contains(sequence, element)
vez defind(array, element)
:Veja o exemplo abaixo:
fonte
no Swift 4.2
.index (where :) foi alterado para .firstIndex (where :)
fonte
Swift 4. Se sua matriz contiver elementos do tipo [String: AnyObject]. Então, para encontrar o índice do elemento, use o código abaixo
Ou Se você deseja encontrar o índice com base na chave do Dicionário. Aqui a matriz contém objetos da classe Model e eu estou correspondendo a propriedade id.
fonte
Swift 2.1
Swift 3
fonte
let array
? O uso deself
é questionável também.No Swift 4 , se você estiver percorrendo sua matriz DataModel, verifique se o modelo de dados está em conformidade com o Equatable Protocol, implemente o método lhs = rhs e somente então você poderá usar ".index (of". Por exemplo
E depois,
fonte
No Swift 2 (com o Xcode 7),
Array
inclui umindexOf
método fornecido peloCollectionType
protocolo. (Na verdade, doisindexOf
métodos - um que usa igualdade para combinar com um argumento e outro que usa um fechamento.)Antes do Swift 2, não havia uma maneira de tipos genéricos, como coleções, fornecerem métodos para os tipos concretos derivados deles (como matrizes). Então, no Swift 1.x, "índice de" é uma função global ... E também foi renomeada, portanto, no Swift 1.x, essa função global é chamada
find
.Também é possível (mas não necessário) usar o
indexOfObject
método deNSArray
... ou qualquer outro método de pesquisa mais sofisticado da Foundation que não tenha equivalentes na biblioteca padrão do Swift. Apenasimport Foundation
(ou outro módulo que importa transitivamente o Foundation), faça a conversãoArray
paraNSArray
e você poderá usar os vários métodos de pesquisaNSArray
.fonte
Qualquer uma dessas soluções funciona para mim
Esta é a solução que tenho para o Swift 4:
fonte
Você também pode usar a biblioteca funcional Dollar para executar um indexOf em uma matriz como tal http://www.dollarswift.org/#indexof-indexof
fonte
Se você ainda estiver trabalhando no Swift 1.x
Então tente,
fonte
Para o SWIFT 3, você pode usar uma função simples
Isso fornecerá a posição numérica, para que você possa usar como
Espero ser útil
fonte
SWIFT 4
Digamos que você queira armazenar um número da matriz chamada cardButtons em cardNumber, você pode fazer o seguinte:
remetente é o nome do seu botão
fonte
Swift 4
Para tipos de referência:
fonte
No Swift 4/5, use "firstIndex" para encontrar o índice.
fonte
Caso alguém tenha esse problema
apenas faça isso
então
fonte
Para
(>= swift 4.0)
É bastante simples. Considere o seguinte
Array
objeto.Para obter o índice do elemento
rose
, tudo o que você precisa fazer é:Nota:
Array.index(of:)
retorna umOptional<Int>
.nil
implica que o elemento não está presente na matriz.Você pode querer desembrulhar o valor retornado ou usar um
if-let
para contornar o opcional.fonte
Basta usar o método firstIndex.
fonte