【问题标题】:Swift: Removing duplicate objects from array with a UUIDSwift:使用 UUID 从数组中删除重复对象
【发布时间】:2021-08-14 05:44:12
【问题描述】:

我正在使用 UUID 来使用 DiffableDataSource,但我正在使用的数据集包含每个对象的副本。

这是我在操场上使用的代码示例:

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/01/2021"),    
  MovieSearch(Name: "Blade Runner: 2049", StartDate: "01/07/2021"),    
  MovieSearch(Name: "UBIK", StartDate: "01/14/2021")    
]

由于在初始化时添加了 UUID,在这种情况下是否有合理的方法来删除重复项?

【问题讨论】:

  • 你用 uuid 做什么?

标签: arrays swift uuid diffabledatasource


【解决方案1】:

如果您不关心电影的顺序,可以使用 Swift 的 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/01/2021"),    
  MovieSearch(Name: "Blade Runner: 2049", StartDate: "01/07/2021"),    
  MovieSearch(Name: "UBIK", StartDate: "01/14/2021")    
]

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

【讨论】:

    【解决方案2】:

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

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

    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)
    

    【讨论】:

    • 就是这样。谢谢!
    • @tylerperkins 请将其标记为答案 :)
    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多