快速清除对象数组中不同值的方法

问题描述

我有这样的模型课:

struct AnswerModel:Decodable {
        let questionId,answerId:Int?
        var answer:Int?
        
        enum CodingKeys: String,CodingKey {
            case answer
            
            case questionId = "question"
            case answerId = "answer_id"
        }
        
    }

,有时此对象的数组可以包含具有相似的questionId的元素。我是这样区分的:

self.userAnswers += (pollsJson?.userAnswers)!
                
                
var seen = Set<Int>()
var unique = [PollsArray.AnswerModel]()
for element in self.userAnswers{
    if !seen.contains(element.questionId!) {
       unique.append(element)
       seen.insert(element.questionId!)
    }
}
                
self.userAnswers = unique

因此,我收到具有唯一值的数组。也许有人会建议更好一点?

解决方法

您可以使AnswerModel符合Hashable,定义自定义等式以仅检查questionId,然后将Array转换为Set将删除重复项自动。

extension AnswerModel: Hashable {
    func hash(into hasher: inout Hasher) {
        hasher.combine(questionId)
    }

    static func == (lhs: AnswerModel,rhs: AnswerModel) -> Bool {
        lhs.questionId == rhs.questionId
    }
}

测试代码:

let userAnswers = [
    AnswerModel(questionId: 1,answerId: 1,answer: 1),AnswerModel(questionId: 1,answerId: 2,answer: 3),AnswerModel(questionId: 2,answer: 1)
    ]

let unique = Set(userAnswers) // {questionId 1,answerId 1,answer 1} and {questionId 2,answer 1}