Найдите значение объекта по индексу и сохраните его в другом массиве с помощью swift

#arrays #swift

#массивы #swift

Вопрос:

Найдите значение объекта по индексу и сохраните его в другом массиве с помощью swift.

Может кто-нибудь подсказать мне наиболее оптимизированный способ для следующего фрагмента кода

     var selectedIndex = [1,3,5]
    var allData : [Person] = []
    var ids: [Int] = []
    for (index, item) in allData.enumerated() {
        for id in selectedIndex {
            if id == index {
                ids.append(item.id)
            }
        }
    }
  

Комментарии:

1. «наиболее оптимизированный способ» ? ids = [allData[1].id,allData[3].id,allData[5].id]

2. @JoakimDanielson Нет ничего плохого в том, чтобы спросить, как оптимизировать его код. Как бы то ни было, он излишне перебирает все элементы в своей коллекции.

Ответ №1:

Если вы уверены, что все индексы действительны, вы можете просто сопоставить выбранные вами индексы:

 let ids = selectedIndex.map { 
    allData[$0].id
}
  

Если вы хотите убедиться, что выбранный индекс существует в allData:

 let ids = selectedIndex.compactMap {
    allData.indices ~= $0 ? allData[$0].id : nil
}
  

Ответ №2:

Поскольку ваши индексы отсортированы, вы можете взять только ту часть allData , которая вам нужна, используя prefix .

 let ids =
  allData
  .prefix(selectedIndices.last.map { $0   1 } ?? 0)
  .enumerated()
  .compactMap {
    Optional($0)
      .filter { selectedIndices.contains($0.offset) }?
      .element.id
  }
  
 public extension Optional {
  /// Transform `.some` into `.none`, if a condition fails.
  /// - Parameters:
  ///   - isSome: The condition that will result in `nil`, when evaluated to `false`.
  func filter(_ isSome: (Wrapped) throws -> Bool) rethrows -> Self {
    try flatMap { try isSome($0) ? $0 : nil }
  }
}