问题描述
我有这样的模型课:
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}