Czy istnieje metoda o nazwie indexof lub coś podobnego?Jak znaleźć indeks elementu w Swift?
var array = ["Jason", "Charles", "David"]
indexOf(array, "Jason") // Should return 0
Czy istnieje metoda o nazwie indexof lub coś podobnego?Jak znaleźć indeks elementu w Swift?
var array = ["Jason", "Charles", "David"]
indexOf(array, "Jason") // Should return 0
EDIT: Od Swift 3.0, należy użyć metody .index(where:)
zamiast śledzić i zmiany w edycji Swift 2.0 poniżej.
EDYCJA: Od Swift 2.0 powinieneś użyć metody indexOf
. Również zwraca nil
lub pierwszy indeks jego argumentu.
if let i = array.indexOf("Jason") {
print("Jason is at index \(i)")
} else {
print("Jason isn't in the array")
}
Użyj funkcji find
. Zwraca wartość nil
(jeśli wartość nie zostanie znaleziona) lub pierwszy indeks wartości w tablicy.
if let i = find(array, "Jason") {
println("Jason is at index \(i)")
} else {
println("Jason isn't in the array")
}
Przedłużenie Array może zdziałać cuda tutaj. Oto realizacja dzielone w this StackOverflow answer:
extension Array {
func find (includedElement: T -> Bool) -> Int? {
for (idx, element) in enumerate(self) {
if includedElement(element) {
return idx
}
}
return nil
}
}
Swift 2.0 ma array.indexOf (...), więc nie jest to już potrzebne – n13
Możesz dodać Array rozszerzenie, które jest dokładnie to, co chcesz, a mianowicie:
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
}
}
które teraz pozwala używać .indexOf()
wszystkich Swift tablic, np:
["Jason", "Charles", "David"].indexOf("Jason") //0
że wykonane z tej funkcji, jak wyżej, ale powrót tablicę wskaźników
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
}
}
Może to być przydatne dla Ciebie
Chociaż odpowiedź od Max jest wielki, nie pozwalają znaleźć wiele indeksów z wielu obiektów, tj. indeksy podzbioru tablicy. Jeśli potrzebujesz tej funkcjonalności, rozszerzenia są, jak zawsze, twój najlepszy przyjaciel
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
}
Uwaga *: Prace nad Swift 1.2, jeśli chcesz kompatybilność z 1,1, wymienić! -> jak
W Swift 2.0 (Xcode 7.1b), można użyć
if let result = array.indexOf("Jason")
podczas find(array, "Jason")
jest przestarzała.
uwaga: znaleźć współpracuje z dowolnym typem obiektu w tablicy tego samego typu obiektów ... – BananaAcid
'find' już nie działa dla tablic w Swift 2.0 – kakubei
@kakubei dzięki aktualizowany – nathan