В качестве аргумента можно передавать протокол в качестве типа, если протокол не содержит ассоциированный тип (Hashable, например). И будет все равно какой там тип, главное, чтобы он реализовал протокол. Ну если там у классов много общих свойств и много общего в поведении, то понятно. Чтобы для каждого класса не реализовать каждый раз одну и ту же логику - придётся наследоваться.