我有一个协议“ 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”,因此我应该如何实现删除。我想从左到右删除第一个看到的对象?
答案 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)
}
}
}