Swift:使用 UUID 从数组中删除重复对象

问题描述

我正在使用 UUID 来使用 DiffableDataSource,但我正在使用一个数据集,该数据集具有每个对象的副本。

这是我在 Playground 中使用的代码示例:

var movies: [MovieSearch] = []

struct MovieSearch: Hashable,Decodable,Equatable {
    let uuid = UUID()
    private enum CodingKeys : String,CodingKey { case Name,StartDate }
    
    let Name: String
    let StartDate: String
}
    
movies = [
  MovieSearch(Name: "Blade Runner",StartDate: "01/01/2021"),MovieSearch(Name: "Blade Runner: 2049",StartDate: "01/07/2021"),MovieSearch(Name: "UBIK",StartDate: "01/14/2021"),MovieSearch(Name: "Blade Runner",StartDate: "01/14/2021")    
]

既然UUID是在初始化的时候加的,这种情况下有没有合理的方法删除重复项?

解决方法

如果您不关心电影的顺序,您可以使用 Swift's Set。

由于您的 MovieSearch 符合 Hashable 协议,Set 将确保只存在一个副本。

您可以使用 for-in 表示法遍历 Set,类似于数组。

https://developer.apple.com/documentation/swift/set

struct MovieSearch: Hashable,Decodable,Equatable {
    let uuid = UUID()
    private enum CodingKeys : String,CodingKey { case Name,StartDate }
    
    let Name: String
    let StartDate: String
}
    
var movies:Set = [
  MovieSearch(Name: "Blade Runner",StartDate: "01/01/2021"),MovieSearch(Name: "Blade Runner: 2049",StartDate: "01/07/2021"),MovieSearch(Name: "UBIK",StartDate: "01/14/2021"),MovieSearch(Name: "Blade Runner",StartDate: "01/14/2021")    
]

for movie in movies {
   print(movie.Name)
}
,

所以我猜你想要做的是删除那些重复项?

然后编写一个函数,根据电影名称(我猜是唯一的)删除重复项并使用它进行过滤。

func removeDup(movies: [MovieSearch]) -> [MovieSearch] {
    var uniqueMovies = Set<String>()
    var moviesWithoutDups = [MovieSearch]()
    
    for movie in movies {
        if !uniqueMovies.contains(movie.name) {
            moviesWithoutDups.append(movie)
            uniqueMovies.insert(movie.name)
        }
    }
    return moviesWithoutDups
}

然后使用函数:

movies = removeDup(movies: movies)