迅速发展的世界:SE-0185综合了可量化和可哈希化的一致性

Swift世界演变:SE-0185合成可量化和可哈希化的一致性Swift正在发展。 Swift 4即将出现,Swift 5开始。 我开始这个新系列,继续关注它的发展。 这不是详细的建议的简单解释。 SE-0185刚刚被接受。 因此,让我们开始吧。

SE-0185是关于Equatable和Hashable的。 我已经发布了一系列解释Equatable,Comparable和Hashable的文章,如下所示。

迅捷世界:平等,可比和可哈希化的第1部分

迅捷世界:平等,可比和可哈希化的第二部分

迅捷世界:平等,可比和可哈希化的第三部分

简而言之,SE-0185建议通过编译器自动合成代码,使其符合Equatable和Hashable,而不是由开发人员手动合成。

我们将从具有两个属性的简单Struct超级英雄开始:name和real name。

要使用==进行相等性测试,需要遵循Equatable,如以下代码片段所示。 假设超级英雄的名字和真实名字相等时是相等的。

一个明显的不足是,类型中属性的任何更改都会导致Equatable一致性的更改。 通过手动更新将增加维护成本和潜在风险。 如果我们将出生日期或年龄添加到超级英雄怎么办? 我们需要相应地更新此一致性。

在相同的情况下,可散列尤其是需要高质量的散列函数以实现一致性。

该提案中的解决方案是

如果类型的所有成员都是Equatable / Hashable,则该类型综合符合Equatable / Hashable的一致性。

例如,在我们的超级英雄中,由于name和realName均为String,因此Equatable的一致性由编译器合成。 如果我们给出自己的实现,它将被我们的实现所取代。

现实世界更加复杂。 该提案描述了不同类型和不同条件的详细信息。 请从SE-0185和线程swift-evolution通用等效性,哈希性和可比性中获取详细信息。 该建议成真后,我们会回来。

谢谢你的时间。 请拍手让更多的人看到此文章。 请点击关注,关注我和Swift World 强烈欢迎本周《 Swift World》的建议