Есть ли метод, называемый indexof или что-то подобное?
var array = ["Jason", "Charles", "David"]
indexOf(array, "Jason") // Should return 0
Есть ли метод, называемый indexof или что-то подобное?
var array = ["Jason", "Charles", "David"]
indexOf(array, "Jason") // Should return 0
РЕДАКТИРОВАТЬ: Начиная с 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")
}
В Swift 2.0 (Xcode 7.1b) вы можете использовать
if let result = array.indexOf("Jason")
while find(array, "Jason")
устарел.
Я сделал эту функцию, как указано выше, но возвращает массив индексов
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
}
}
Возможно, вам это будет полезно
Массив может быть подключен к NSArray, поэтому вы можете использовать:
array.bridgeToObjectiveC().indexOfObject("Jason")
Расширение массива может творить чудеса здесь. Здесь реализация разделяет в 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
}
}
Вы можете добавить расширение массива, которое делает именно то, что вы хотите, 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
В то время как ответ от 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, замените как! → как