Как получить уникальные идентификаторы объектов в массиве swift

ios swift custom-object arrayobject

3711 просмотра

3 ответа

1633 Репутация автора

У меня есть такой класс -

class Event: NSObject
{
    var eventID: String?
    var name:String?
}

Теперь у меня есть массив Eventобъектов, как

var events = [Event]()

var event1 = Event()
event1.eventID = "1"
event1.name = "Anu"

var event2 = Event()
event2.eventID = "2"
event2.name = "dev"

var event3 = Event()
event3.eventID = "1"
event3.name = "Anu"

events.append(event1)
events.append(event2)
events.append(event3)

чтобы получить уникальные eventID из массива, я написал такой код, который прекрасно работает -

func getUniqueIDsFromArrayOfObjects(events:[Event])->NSArray
{
    let arr = events.map { $0.eventID!}
    let uniquearr:NSMutableArray = NSMutableArray()
    for obj in arr
    {
        if !uniquearr.containsObject(obj) {
            uniquearr.addObject(obj)
        }
    }
    return uniquearr;
}

print(getUniqueIDsFromArrayOfObjects(events))

Я хотел знать, есть ли альтернативный способ получить уникальные идентификаторы из массива объектов более эффективно, чем я использую. Может быть что-то с помощью NSPredicate.

Поскольку массив имеет thousandsобъекты, мой код будет делать больше итераций.

Автор: Anupam Mishra Источник Размещён: 18.07.2016 01:01

Ответы (3)


1 плюс

5489 Репутация автора

A Set- это набор, похожий на массив, который предотвращает дублирование. Ты можешь сделать:

func getUniqueIDsFromArrayOfObjects(events:[Event])->[Event] {
    return Array(Set(events.map { $0.eventID! }))
}

Обратите внимание, что порядок элементов в наборе не определен, поэтому, если вы заботитесь о порядке элементов, вам следует попробовать другое решение.

Автор: Connor Размещён: 18.07.2016 01:27

10 плюса

75998 Репутация автора

Решение

Вы можете использовать Setдля получения только уникальных значений. Я хотел бы предложить, чтобы ваша функция возвращала массив Swift, а не NSArray.

func getUniqueIDsFromArrayOfObjects(events:[Event])->[String]
{
   let eventIds = events.map { $0.eventID!}
   let idset = Set(eventIds)
   return Array(idset)
}
Автор: Paulw11 Размещён: 18.07.2016 01:31

0 плюса

2546 Репутация автора

    let uniqueRecords = jobs.reduce([], {
        $0.contains($1) ? $0 : $0 + [$1]
    })
Автор: Dhaval H. Nena Размещён: 12.06.2017 11:04
Вопросы из категории :
32x32