问题描述
我正在使用 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)