У меня есть массив таких объектов, как:
let food = [apple, orange, peach, pear]
.
Каждый объект выглядит примерно так:
let apple : Fruit = [
name: "Apple",
colors: ["red", "yellow", "green", "orange"]
]
У меня есть еще один массив строк, который должен быть отфильтрован массивом food
:
let avoid = ["red", "yellow"]
Я хочу создать новый массив из массива food
с объектами Fruit
, которые не содержат любого из colors
в массиве avoid
. Так что в этом случае Apple
не будет в массиве еды, потому что он содержит и red
, и yellow
.
Спасибо!
имена переменных начинаются со строчной буквы. Имена типов начинаются с заглавной буквы. apple
— это var Fruit
— это тип. :D
Поскольку вы не дали никакого определения объекта Fruit
, я рассматриваю его для справки.
struct Fruit {
let name: String
let colors: [String]
}
Создание массива food
,
let apple = Fruit(name: "Apple", colors: ["red", "yellow", "green", "orange"])
let orange = Fruit(name: "Orange", colors: ["red", "green", "orange"])
let peach = Fruit(name: "Peach", colors: ["green", "orange"])
let pear = Fruit(name: "Pear", colors: [ "green"])
let food = [apple, orange, peach, pear]
Для filter
массива food
с использованием массива avoid
мы можем использовать метод Set
intersection
, т.е.
let avoid = ["red", "yellow"]
let filteredFruits = food.filter { return Set($0.colors).intersection(avoid).isEmpty }
print(filteredFruits.map({ $0.name })) //["Peach", "Pear"]
filteredFruits
будет содержать объекты - pear
и peach
Я бы сделал первоначальное предположение, что Fruit
— это структура, а не класс, поскольку в этом примере ему не обязательно быть классом, а структура всегда должна быть первым выбором для типов.
Это всего лишь пример. Как я уже сказал, он тоже мог принять это class
. Мы не уверены в этом. class
и struct
всегда зависят от вашего варианта использования.
Именно поэтому здесь следует выбирать struct. Поскольку это то, что вы бы выбрали для этого примера, если бы писали его. Ничто здесь не нуждается в классе.
Идеально — это то, что я имел в виду :) И да, я забыл привести пример объекта Fruit
.
let res= food.filter(function(fruit) {
return !fruit.colors.some(r=> avoid.indexOf(r) >= 0)
})
Пожалуйста, не могли бы вы расширить свой ответ более подробным объяснением? Это будет очень полезно для понимания. Спасибо!
Что означает
Fruit
? Тип, протокол, псевдоним типа? что-то типа не помогает.