#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 }
}
}