Чуть позже гляну. В своё время сам намучался с протоколами, но там нужно было написать type erasure для Equatable. Что оказалось невозможно, если писать по классическому паттерну, только через велосипед.
Просто тут явно два этих протокола нужно как - то подвести под общий знаменатель. Два разнородных, не имеющих родительского протокола не получится использовать без каста к нужному типу.