Что такое обновление для find () в Swift 3? [Дубликат]

Развернувшись на ответах @ lhunath и @ GregV, вот код для людей, которые хотят легко поставить эту проверку внутри оператора if:

exists()
{
  command -v "$1" >/dev/null 2>&1
}

Вот как его использовать:

if exists bash; then
  echo 'Bash exists!'
else
  echo 'Your system does not have Bash'
fi
318
задан Mick MacCallum 2 April 2016 в 17:52
поделиться

16 ответов

Поскольку 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
})
611
ответ дан sschuth 25 August 2018 в 16:37
поделиться

Обновление для Swift 2:

sequence.contains (element): Возвращает true, если заданная последовательность (такая как массив) содержит указанный элемент.

Swift 1:

Если вы хотите просто проверить, содержится ли элемент внутри массива, то есть просто получить логический индикатор, используйте contains(sequence, element) вместо find(array, element):

содержит (sequence, element): Возвращает true, если заданная последовательность (такая как массив) содержит указанный элемент.

См. пример ниже:

var languages = ["Swift", "Objective-C"]
contains(languages, "Swift") == true
contains(languages, "Java") == false
contains([29, 85, 42, 96, 75], 42) == true
if (contains(languages, "Swift")) {
  // Use contains in these cases, instead of find.   
}
9
ответ дан Bretsko 25 August 2018 в 16:37
поделиться

В 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.

5
ответ дан Cœur 25 August 2018 в 16:37
поделиться

Вы также можете использовать функциональную библиотеку Dollar для создания indexOf для массива как такового http://www.dollarswift.org/#indexof-indexof

$.indexOf([1, 2, 3, 1, 2, 3], value: 2) 
=> 1
2
ответ дан Encore PTL 25 August 2018 в 16:37
поделиться

Swift 4. Если ваш массив содержит элементы типа [String: AnyObject]. Итак, чтобы найти индекс элемента, используйте приведенный ниже код

var array = [[String: AnyObject]]()// Save your data in array
let objectAtZero = array[0] // get first object
let index = (self.array as NSArray).index(of: objectAtZero)

Или Если вы хотите найти индекс на основе ключа из словаря. Здесь массив содержит объекты класса Model, и я сопоставляю свойство id.

let userId = 20
if let index = array.index(where: { (dict) -> Bool in
       return dict.id == userId // Will found index of matched id
}) {
print("Index found")
}
1
ответ дан Gurjinder Singh Khalsa 25 August 2018 в 16:37
поделиться

Вы можете filter массив с закрытием:

var myList = [1, 2, 3, 4]
var filtered = myList.filter { $0 == 3 }  // <= returns [3]

И вы можете подсчитать массив:

filtered.count // <= returns 1

. Таким образом, вы можете определить , если массив включает ваш элемент, объединив их:

myList.filter { $0 == 3 }.count > 0  // <= returns true if the array includes 3

Если вы хотите найти позицию, я не вижу причудливого пути, но вы можете сделать это следующим образом:

var found: Int?  // <= will hold the index if it was found, or else will be nil
for i in (0..x.count) {
    if x[i] == 3 {
        found = i
    }
}

EDIT

Пока мы находимся в этом, для забавного упражнения продолжим Array, чтобы иметь способ find:

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

Теперь мы можем это сделать:

myList.find { $0 == 3 }
// returns the index position of 3 or nil if not found
76
ответ дан gwcoffey 25 August 2018 в 16:37
поделиться

Если вы все еще работаете в Swift 1.x

, попробуйте,

let testArray = ["A","B","C"]

let indexOfA = find(testArray, "A") 
let indexOfB = find(testArray, "B")
let indexOfC = find(testArray, "C")
2
ответ дан iCyberPaul 25 August 2018 в 16:37
поделиться

Любое из этого решения работает для меня

Это решение i для Swift 4:

let monday = Day(name: "M")
let tuesday = Day(name: "T")
let friday = Day(name: "F")

let days = [monday, tuesday, friday]

let index = days.index(where: { 
            //important to test with === to be sure it's the same object reference
            $0 === tuesday
        })
1
ответ дан Kevin ABRIOUX 25 August 2018 в 16:37
поделиться

Swift 2.1

var array = ["0","1","2","3"]

if let index = array.indexOf("1") {
   array.removeAtIndex(index)
}

print(array) // ["0","2","3"]

Swift 3

var array = ["0","1","2","3"]

if let index = array.index(of: "1") {
    array.remove(at: index)
}
array.remove(at: 1)
2
ответ дан Luca Davanzo 25 August 2018 в 16:37
поделиться

Для SWIFT 3 вы можете использовать простую функцию

func find(objecToFind: String?) -> Int? {
   for i in 0...arrayName.count {
      if arrayName[i] == objectToFind {
         return i
      }
   }
return nil
}

. Это даст номер позиции, поэтому вы можете использовать, например,

arrayName.remove(at: (find(objecToFind))!)

Надеюсь быть полезным

0
ответ дан Marco 25 August 2018 в 16:37
поделиться

Swift 4

Для ссылочных типов:

extension Array where Array.Element: AnyObject {

    func index(ofElement element: Element) -> Int? {
        for (currentIndex, currentElement) in self.enumerated() {
            if currentElement === element {
                return currentIndex
            }
        }
        return nil
    }
}
0
ответ дан Menno 25 August 2018 в 16:37
поделиться

В Swift 4, если вы проходите через массив DataModel, убедитесь, что ваша модель данных соответствует Equatable Protocol, реализуйте метод lhs = rhs, и только тогда вы можете использовать «.index (от«. Например

class Photo : Equatable{
    var imageURL: URL?
    init(imageURL: URL){
        self.imageURL = imageURL
    }

    static func == (lhs: Photo, rhs: Photo) -> Bool{
        return lhs.imageURL == rhs.imageURL
    }
}

И затем,

let index = self.photos.index(of: aPhoto)
3
ответ дан Naishta 25 August 2018 в 16:37
поделиться

Я думаю, что стоит упомянуть, что со ссылочными типами (class) вам может понадобиться сравнение identity , и в этом случае вам просто нужно использовать оператор идентификации === в предикате Закрытие:

Swift 3 / Swift 4:

let person1 = Person(name: "John")
let person2 = Person(name: "Sue")
let person3 = Person(name: "Maria")
let person4 = Person(name: "Loner")

let people = [person1, person2, person3]

let indexOfPerson1 = people.index{$0 === person1} // 0
let indexOfPerson2 = people.index{$0 === person2} // 1
let indexOfPerson3 = people.index{$0 === person3} // 2
let indexOfPerson4 = people.index{$0 === person4} // nil

Обратите внимание, что в приведенном выше синтаксисе используется синтаксис закрывающих замыканий и эквивалентен:

let indexOfPerson1 = people.index(where: {$0 === person1})

Swift 2 - синтаксис функции index:

let indexOfPerson1 = people.indexOf{$0 === person1}

* Обратите внимание на соответствующие и полезные комментарий от paulbailey о class типах, которые реализуют Equatable, где вам нужно рассмотреть, следует ли сравнивать, используя === ( identity ]) или == ( равенство ). Если вы решите сопоставить с помощью ==, вы можете просто использовать метод, предложенный другими (people.index(of: person1)).

133
ответ дан Nikolay Suvandzhiev 25 August 2018 в 16:37
поделиться

Swift 4

func index(of element: Element) -> Int?

var alphabets = ["A", "B", "E", "D"]

Пример1

let index = alphabets.index(where: {$0 == "A"})

Пример2

if let i = alphabets.index(of: "E") {
    alphabets[i] = "C" // i is the index
}
print(alphabets)
// Prints "["A", "B", "C", "D"]"
5
ответ дан Saranjith 25 August 2018 в 16:37
поделиться

Пока indexOf() работает отлично, он возвращает только один индекс.

Я искал элегантный способ получить массив индексов для элементов, которые удовлетворяют некоторому условию.

Вот как это можно сделать:

Swift 3:

let array = ["apple", "dog", "log"]

let indexes = array.enumerated().filter {
    $0.element.contains("og")
    }.map{$0.offset}

print(indexes)

Swift 2:

let array = ["apple", "dog", "log"]

let indexes = array.enumerate().filter {
    $0.element.containsString("og")
    }.map{$0.index}

print(indexes)
21
ответ дан Serhii Yakovenko 25 August 2018 в 16:37
поделиться

Для настраиваемого класса вам необходимо реализовать Equatable protocol.

import Foundation

func ==(l: MyClass, r: MyClass) -> Bool {
  return l.id == r.id
}

class MyClass: Equtable {
    init(id: String) {
        self.msgID = id
    }

    let msgID: String
}

let item = MyClass(3)
let itemList = [MyClass(1), MyClass(2), item]
let idx = itemList.indexOf(item)

printl(idx)
12
ответ дан ZYiOS 25 August 2018 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: