通过对象从数组中删除

时间:2020-05-27 11:39:54

标签: swift

我有一个协议“ Visual”,它由Point2D和Square两个类实现。

Places.initialize(getApplicationContext(),YOUR API KEY);

我制作了一个Storage类,该类将元素保留在数组中,并具有添加和删除两个操作


protocol Visual {
    var text: String { get }

}


class Point2D : Visual {
  var text: String 
    var x: Double
    var y: Double
    init(x : Double , y : Double)
    {
      self.x = x 
      self.y = y
      self.text = "I'm 2d point"
      }
}

class Square : Visual {
  var text: String 
    var x: Int

    init(x : Int)
    {
      self.x = x 
      self.text = "I'm square"
     }
}


添加工作正常,但是由于我将具有反射性的对象传递给“ Visual”,因此我应该如何实现删除。我想从左到右删除第一个看到的对象?

2 个答案:

答案 0 :(得分:0)

您可以在声明Visual协议时实现Equatable协议,这样,您就可以比较对象并了解哪些相等,必须将其删除。

答案 1 :(得分:0)

首先,您需要一种评估它们是否相等的方法。我建议这样。 (我发现关于协议平等的this answer非常有用。)

protocol Visual {
    var text: String { get }
    func isEqual(to other: Visual) -> Bool
}

extension Point2D {
    func isEqual(to other: Visual) -> Bool {
        return (other as? Self).flatMap({ $0.x == self.x && $0.y == self.y }) ?? false
    }
}

extension Square {
    func isEqual(to other: Visual) -> Bool {
        return (other as? Self).flatMap({ $0.x == self.x }) ?? false
    }
}

然后您可以找到要删除的项目的第一个索引,并使用返回的索引将其删除。

class Storage {

    // ...

    func delete(item : Visual) {
        if let index = elements.firstIndex(where: { $0.isEqual(to: item) }) {
            elements.remove(at: index)
        }
    }
}
相关问题