本文介绍了如何在本机 Swift 中实现以前称为 NSMutableOrderedSet 的可变有序集泛型类型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试实现一个通用的 Mutable Ordered Set 类型,它需要符合许多协议才能像 Swift 中的 Array 和 Set 一样运行.首先要实现泛型类型元素需要符合 Hashable
并且通用结构需要符合 RandomAccessCollection
, SetAlgebra
, ExpressibleByArrayLiteral
,AdditiveArithmetic
, RangeReplaceableCollection
和 MutableCollection
.我还想允许下标访问它的 SubSequence
添加对 PartialRangeThrough
、PartialRangeUpTo
、PartialRangeFrom
和 的支持>UnboundedRange
也是如此.
这是我的通用 OrderedSet
结构声明:
public struct OrderedSet{公共初始化(){}私有 var 元素:[元素] = []私有变量集:设置<元素>= []}
尽管这是一个自我回答的问题,但我真的很感激并鼓励新的答案,对此实施的一些反馈和/或关于如何修复/改进它的建议:
编辑/更新:
sorted
方法按预期工作,但变异 sort
它甚至没有改变元素顺序.
可变集合
声明变异
函数排序()
当 Self 符合 RandomAccessCollection 且 Element 符合 Comparable 时可用.
var numbers: OrderedSet = [15, 40, 10, 30, 60, 25, 5, 100]数字[0..<4]//[15, 40, 10, 30]numbers[0..<4].sorted()//[10, 15, 30, 40]numbers[0..<4].sort()//[15, 40, 10, 30, 60, 25, 5, 100]打印(数字)//打印[15, 40, 10, 30, 60, 25, 5, 100]"//但它应该打印[10, 15, 30, 40, 60, 25, 5, 100]"
我该如何解决?
解决方案
可变有序集的原生 Swift 实现:
public struct OrderedSet{公共初始化(){}私有 var 元素:[元素] = []私有变量集:设置<元素>= []}
<块引用>
符合 MutableCollection 协议
要将 MutableCollection 协议的一致性添加到您自己的自定义集合中,请升级您的类型的下标以支持读取和写入访问.存储在 MutableCollection 实例的下标中的值随后必须可以在同一位置访问.也就是说,对于可变集合实例 a、索引 i 和值 x,以下代码示例中的两组赋值必须相等:
扩展 OrderedSet: MutableCollection {公共下标(索引:索引)->元素 {获取{元素[索引]}//放 {//守卫 set.update(with: newValue) == nil else {//insert(remove(at: elements.firstIndex(of: newValue)!), at: index)// 返回/
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!