зацикливание на массиве объектов и отображение элементов без дублирования их - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть массив объектов, у которого есть регион и город .. эти регион и город могут повторяться в более чем одном объекте ..

Я хочу зациклить их и отобразить эти регионы и города, не дублируя их ...

как я могу это сделать?

это класс:

  struct Shifts : Decodable{
let id: Int
let region: String
let city: String
let nationality: String
let idService: Int
let shiftDate: String
let shiftType: String
let weekday: String
let quantityStaff: Int
let leadHours: Int
let createdAt: String?
let updatedAt: String?
let deletedAt: String?
}

пример массива:

shift = [(id: 1, регион: восточный, город: Даммам, национальность: саудовская, idService: 1, shiftDate: 11-12-2019, shiftType: день, день недели: сб, количество персонала: 1, лидерство: 7), (id: 2, регион: восточный, город: дахран, национальность: саудовская, idService: 2, shiftDate: 22-1-12018, shiftType: полный, рабочий день: пн, количество персонала: 2, время работы: 4)]

обе смены находятся в восточном регионе ... поэтому я не хочу отображать восточный дважды для пользователя ...

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

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018
struct Shifts : Decodable{
    let id: Int
    let region: String
    let city: String
    let nationality: String
    let idService: Int
    let shiftDate: String
    let shiftType: String
    let weekday: String
    let quantityStaff: Int
    let leadHours: Int
    let createdAt: String?
    let updatedAt: String?
    let deletedAt: String?
}

struct Area: Hashable{
    var region : String
    var city : String

    var hashValue: Int {
        return "(\(region),\(city))".hashValue
    }

    static func == (lhs: Area, rhs: Area) -> Bool {
        return lhs.region == rhs.region && lhs.city == rhs.city
    }
}

let shiftsArr = [Shifts]()

var seen = Set<Area>()
var unique = [Shifts]()
for shift in shiftsArr {
    let area = Area(region: shift.region, city:shift.city)
    if !seen.contains(area) {
        unique.append(shift)
        seen.insert(area)
    }
}

let areas = unique.map{
    return Area(region: $0.region, city: $0.city)
}
0 голосов
/ 29 апреля 2018

Вы можете использовать набор для фильтрации сдвигов с уникальными регионами:

let myShifts = [Shifts]()
//populate your myShifts array.

func filteredShifts() -> [Shifts] {

    var regions = Set<String>()

    let filteredShifts = myShifts.filter {

      if !regions.contains($0.region) {
        regions.insert(aShift.region)
        return true
      } else { return false }
    }
    return filteredShifts
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...