Я искал эту проблему и не нашел ни одного решения, которое помогло бы мне использовать последнюю версию Xcode и Swift. Я использую три массива:

1. baseArray[Meal]: array filled with every meal. Not locally saved.

2. favoritesArray[Favorite]: with names of all favorite meals, locally saved by the user with NSKeyedArchiver.
3. filteredArray[Meal]: baseArray but filtered for searchterm. In code: 

    (filteredArray = baseArray.filter { $0.type == searchtext }}

Я использую последний массив в tableView. Если они хотят видеть все блюда, filteredArray совпадает с baseArray.

Мой вопрос: как я могу получить filteredArray, что в нем есть все любимые блюда (так где Meal.title == Favorite.name). Как объединить три массива?

Я перепробовал много вариантов на прошлой неделе, но ни один из них не помог .. Надеюсь, Вы можете мне помочь !!

2
mkw1975 25 Ноя 2016 в 14:53

2 ответа

Лучший ответ

Это делает то, что вы хотите:

struct Meal {
  let title: String
}

struct Favorite {
  let name: String
}

let meal1 = Meal(title: "Soup")
let meal2 = Meal(title: "Stew")
let meal3 = Meal(title: "Pizza")

let favorite1 = Favorite(name: "Stew")

let baseArray = [meal1, meal2, meal3]
let favoritesArray = [favorite1]

let favoriteNames = favoritesArray.map { $0.name }

let filteredArray = baseArray.filter { favoriteNames.contains($0.title) }
6
ganzogo 25 Ноя 2016 в 12:04

Это решение для вас, если я правильно понимаю ваш вопрос.

struct Meal {
    let name: String
}

struct Favorite {
    let name: String
}

let baseArray = [Meal(name: "Meal1"), Meal(name: "Meal2"), Meal(name: "Meal3")]

let favoritesArray = [Favorite(name: "Meal1")]

let searchText = "Meal3"

let filteredArray = baseArray.filter { $0.name == searchText }
print(filteredArray)
// [Meal(name: "Meal3")]

let combinedArray = baseArray.reduce(filteredArray) { array, element in
    // First condition check if the current meal (element) in contained in the favorites
    // Second checks if the favorite meal isn't already in the filteder array
    if favoritesArray.contains(where: { $0.name == element.name }) &&
        !filteredArray.contains(where: { $0.name == element.name }) {
        return array + [element]
    }
    return array
}

print(combinedArray)
// [Meal(name: "Meal3"), Meal(name: "Meal1")]
1
Lexorus 25 Ноя 2016 в 12:15