Удаление из массива через объект - PullRequest
0 голосов
/ 27 мая 2020

У меня есть протокол «Visual», который реализован двумя классами: Point2D и Square


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"
     }
}


Я создал класс Storage, который будет хранить в массиве элементы и имеет две операции добавления и удаления


class Storage
{
  var elements : [Visual]

  init()
  {
    elements = [Visual]()
  }

  func add(item : Visual)
  {
    elements.append(item)

  }
  func delete(item : Visual)
  {

  }

  func printItems()
  {
    print(elements)
  }
}

Добавление работает нормально, но как мне реализовать удаление, поскольку я передаю объект со ссылкой на «Visual». Я хочу удалить первый увиденный объект слева направо?

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Прежде всего, вам нужен способ оценить их равенство. Я бы предложил что-то вроде этого. (Я нашел этот ответ о равенстве по протоколу очень полезным.)

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)
        }
    }
}
0 голосов
/ 27 мая 2020

Вы можете реализовать протокол Equatable, когда объявляете протокол Visual, таким образом вы сможете сравнивать объекты и понимать, какие из них равны, и их необходимо удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...