Как отфильтровать объекты из массива Strings в Swift - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть массив allMenuItems, как показано ниже, который я пытаюсь отфильтровать из массива идентификаторов.Как это достижимо в Swift?У меня есть некоторое представление о функциях высшего порядка, но до сих пор я не смог отфильтровать это успешно.Любые указатели на то, как этого можно достичь, будут приветствоваться, спасибо.

struct MenuItems {
    var id: String
    var name: String

    init() {
        self.id = ""
        self.name = ""
    }
}

var m1 = MenuItems()
m1.id = "1"
m1.name = "Name 1"

var m2 = MenuItems()
m2.id = "2"
m2.name = "Name 2"

var m3 = MenuItems()
m3.id = "3"
m3.name = "Name 3"

var allMenuItems: [MenuItems] = [m1, m2, m3] // [{id "1", name "Name 1"}, {id "2", name "Name 2"}, {id "3", name "Name 3"}]

var anArrayOfIds: [String] = ["1", "3"]

Отфильтрованный вывод будет:

var filteredMenuItems: [MenuItems] = [m1, m3] // [{id "1", name "Name 1"}, {id "3", name "Name 3"}]

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

Прежде всего, пожалуйста, не используйте странный синтаксис в структуре, такой как

init() {
     self.id = ""
     self.name = ""
}

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

let m1 = MenuItem(id: "1", name: "Name 1")

Вы можете даже объявить элементы как константы

struct MenuItem {
    let id, name : String
}

И не аннотировать типы, которые может выводить компилятор.


Отфильтруйте массив по другому массиву id значений с помощью

let filteredMenuItems = allMenuItems.filter{ anArrayOfIds.contains($0.id) }
0 голосов
/ 06 декабря 2018

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

let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id) }

Я бы посоветовал вам:

  • удалить бессмысленный инициализатор,
  • сделать id целое число,
  • , если свойства не будут изменены после инициализации, тогда используйте let вместо var,
  • , чтобы anArrayOfIds был набором вместо массива, поскольку contains метод будет O (1) вместо O (n) .

Реализация всех этих рекомендаций дает следующий код:

struct MenuItems {
    let id: Int
    let name: String
}

let m1 = MenuItems(id: 1, name: "Name 1")
let m2 = MenuItems(id: 2, name: "Name 2")
let m3 = MenuItems(id: 3, name: "Name 3")

let allMenuItems: [MenuItems] = [m1, m2, m3]

var aSetOfIds: Set<Int> = [1, 3]  //I used a var if aSetOfIds could be changed

var filteredMenuItems = allMenuItems.filter { aSetOfIds.contains($0.id) }
0 голосов
/ 06 декабря 2018

Вы можете использовать фильтр и содержит

let filtered = allMenuItems.filter( { anArrayOfIds.contains($0.id) })
0 голосов
/ 06 декабря 2018

Как насчет

let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id)}

Это дает мне пункты с 1 и 3.

Я позволил себе немного обновить ваш код:

struct MenuItems {
    let id: String
    let name: String
}

let m1 = MenuItems(id: "1", name: "Name 1")
let m2 = MenuItems(id: "2", name: "Name 2")
let m3 = MenuItems(id: "3", name: "Name 3")

let allMenuItems = [m1, m2, m3]
let anArrayOfIds: [String] = ["1", "3"]

let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id)}

Надеюсь, что поможет

...