如何使用 Equatable 创建扩展以删除自定义数组元素?

Posted

技术标签:

【中文标题】如何使用 Equatable 创建扩展以删除自定义数组元素?【英文标题】:How to create extension with Equatable to delete custom array element? 【发布时间】:2017-08-11 09:29:00 【问题描述】:

我创建了自定义数组类型。现在我想在其中再添加一个方法,它可以通过将实际元素作为参数传递来删除数组的元素。 我知道如果我们将自定义数组的扩展添加为 Equitable,就可以实现这一点。

下面是我的代理数组代码:

struct ArrayProxy<T> 
 var array: [T] = []

 mutating func append(newElement: T) 
    self.array.append(newElement)

    print("Element added in download queue")
    DownloadContent.downloadChaptersFromDownloadQueue()
 

 mutating func removeAtIndex(index: Int) 
    print("Removed object \(self.array[index]) at index \(index)")
    self.array.remove(at: index)
 

 subscript(index: Int) -> T 
    set 
        print("Set object from \(self.array[index]) to \(newValue) at index \(index)")
        self.array[index] = newValue
    
    get 
        return self.array[index]
    
  

下面是我对代理数组的扩展

extension ArrayProxy where T: Equatable 
    mutating func removeElement(element: T) 
    self.removeAtIndex(index: self.array.index(of: element)!)
 

【问题讨论】:

你有什么问题? 我更新了问题 其实removeElemetat是无法访问的。而且我也怀疑自己做对了还是错了? 【参考方案1】:

强制解开可选值可能会导致错误。

如果索引存在index(of:),则只返回第一个匹配索引。

修复:

extension ArrayProxy where T: Equatable 

    mutating func removeElement(_ element: T) 
        var indexs: [Int] = []
        for (index, foo) in array.enumerated() 
            if foo == element 
                indexs.append(index)
            
        
        indexs.sorted(by: >).forEach(
            array.remove(at: $0)
        )
    

【讨论】:

以上是关于如何使用 Equatable 创建扩展以删除自定义数组元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何扩展使用 AbstractBaseUser 创建的现有自定义用户模型以拥有多种用户类型,如客户、培训师和作者?

值是 Equatable 的字典序列的扩展

来自 equatable 协议的 func == 不适用于自定义对象,swift

通过扩展自动合成 Swift 结构或枚举的 Equatable 一致性

删除以编程方式创建的自定义按钮的边框

如何从自定义基础适配器中删除项目?