У меня была структура VehicleModels
с такими классами, как Car
, Bike
, Plane
. В другом фреймворке VehicleInventory
мне нужно было распечатать настраиваемые описания (специфичные для второго фреймворка) в таблице. Поэтому я добавил протокол DescriptableVehicle
с методом describe()
. Затем я добавил расширения протокола для всех транспортных средств, например:
extension Car: DescriptableVehicle {
func describe() -> String {
return "Car: \(self.vin)" // returns formatted vehicle number
}
}
Однако предположения изменились, и теперь я не выставляю конкретные классы из своего каркаса транспортных средств. Вместо этого я выставляю протоколы типа CarProtocol
, BikeProtocol
, чтобы в целом у меня была та же информация.
Проблема в том, что я больше не могу использовать расширения протокола (или, по крайней мере, не в такой форме), потому что расширение протокола в противоположность расширению класса не может иметь пункт наследования .
Любая идея, как я могу решить проблему, чтобы не сильно изменять свои привычки? Первоначально я думал, что пара where
пунктов в протоколах плюс пара приведения сделают дело, однако без доступа к классам это не помогает. Я также пробовал адаптеры и стирание текста, но либо я использую его плохо, либо он служит другой цели.
Для иллюстрации проблемы я подготовил репозиторий: https://github.com/wedkarz/SwiftProtocolExtensionsProblem
Есть две детские площадки. V1 — это то, что у меня было раньше, и оно работало. V2 содержит то, что у меня есть сейчас, и то, что я пытаюсь заставить работать.
В реальной жизни класс PrivateFramework
представляет собой отдельный фреймворк и протоколы: VehicleProtocol
, CarProtocol
, BikeProtocol
, PlaneProtocol
являются его частью, но DescriptableVehicle
не является частью PrivateFramework
, поэтому его нельзя использовать внутри. Пример иллюстрирует проблему с доступом к конкретным типам и проблему с их расширениями.
Вы можете видеть, что расширения закомментированы, потому что я больше не могу их использовать. Цель состоит в том, чтобы коллекция [VehicleProtocol]
печатала свое содержимое так же, как она работала ранее.