如何在Swift中获取数组对象的唯一标识符

5
我有一个自定义类,像这样 -
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)

为了从数组中获取唯一的事件ID,我编写了以下代码,它可以很好地工作:
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))

我想知道是否有一种比我现在使用的更有效的方法来从对象数组中获取唯一的ID。也许可以使用NSPredicate实现。

因为一个包含数千个对象的数组,我的代码将进行更多的迭代。


1
我建议的最简单方法是创建一个集合。 - Vivek Molkar
如果您不关心结果数组的顺序,那么您可以简单地使用以下代码:let finalArray = Array(Set(arr)) - Mohammed Shakeer
3个回答

10

您可以使用 Set 来获取唯一的值。我建议您将函数返回一个Swift数组而不是NSArray。

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

1
    let uniqueRecords = jobs.reduce([], {
        $0.contains($1) ? $0 : $0 + [$1]
    })

0

Set是一种类似于数组的集合,它可以防止重复。你可以这样做:

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

请注意,集合中项目的顺序是未定义的,因此如果您关心元素的顺序,应尝试不同的解决方案。

1
这将返回一个字符串数组而不是事件数组。 - Jeremiah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接