Двоичный оператор '! ==' нельзя применить к двум 'MyProtocol' - PullRequest
0 голосов
/ 06 ноября 2018

Я создал протокол:

public protocol MyProtocol {
  func doTask()
}

Тогда у меня есть массив для элементов типа MyProtocol:

var taskList: [MyProtocol] = []

Абоненты могут добавлять элементы в taskList, в итоге я получил непустой taskList.

Теперь мне нужна функция, которая могла бы удалить элемент из taskList, вот что я попробовал:

func removeTask(task: MyProtocol) {
   // Compiler error: Binary operator '!==' cannot be applied to two 'MyProtocol'
   taskList = taskList.filter{$0 !== task}
}

Но я получаю ошибку компилятора: Binary operator '!==' cannot be applied to two 'MyProtocol'

Как избавиться от этой ошибки?

=== ОБНОВЛЕНИЕ ===

Спасибо @holex, после изменения MyProtocol только на класс, он работает нормально. Но теперь мне интересно, если мне нужно MyProtocol, чтобы быть не только для класса, что будет тогда решением?

1 Ответ

0 голосов
/ 06 ноября 2018

Вы используете !==, который сравнивает ссылки. Вы не можете сравнивать protocol напрямую, используя этот оператор, поскольку MyProtocol может стать class или struct. Поскольку !== может сравнивать только экземпляры, вы должны явно объявить, что ваш protocol является class.

Пожалуйста, измените MyProtocol на следующее, что должно решить вашу проблему:

protocol MyProtocol: class { // AnyObject can be used here as well
    func doTask()
}

Попытка выполнить это без class или AnyObject не будет работать с вашим текущим дизайном. Возможно, вы захотите реализовать другой метод сравнения.

Также обратите внимание, что вы можете попытаться использовать !=, который может делать то же самое, что вы хотите. Используя этот способ, вам не нужно объявлять class или AnyObject. Поэтому проверьте, работает ли это для вас.

...