Как сказал @SavcaMarin в своем ответе, у вас есть конфликт типов между свойством item
, объявленным в вашем расширении (String?
), и свойством в Car
(String
).
Вы можете увидеть это, если прокомментируете расширение. Компилятор скажет вам, что Car
не соответствует Collectable
. Если вы попросите его создать необходимые заглушки, он создаст func collect
и var item: String?
. Затем он выдает ошибку, что item
переопределен.
Как Роб и Мэтт указали в комментариях на другой ответ, это, похоже, ошибка в компиляторе Swift. Это не указывает на переопределение item
или несоответствие вашего item
протоколу, если есть реализация по умолчанию, которая удовлетворяет требованиям протокола (ваше расширение).
Простоеисправление заключается в том, чтобы сообщить Swift, что item
в Car
- это то же самое, что и элемент в Collectable
, объявив тип явно (String?
), а не полагаясь на вывод типа (который дает String
):
class Car: Collectable {
var item:String? = "letter"
}