Я нигде объект не передал
Дженерики на этапе компиляции создают конкретные реализации для конкретного типа данных подстановки, этот процесс называется специализация.
Твоя дженерик функция легко специализируется, когда ты вызываешь её с реальным объектом. Говоря простым языком, компилятор, находя такой вызов, создает копию этой функции, выполняя подстановки.
Но далее по коду происходит срез типов в массиве до CloudKitManagedObject.Type и дженерик-функция не может специализироваться, т.к. ограничение наложено на объект, который не может быть вычеслен компилятором т.к.
- X: Y требует конкретный тип для X.
- Из типа Protocol.Type его вычислить невозможно
То есть, SyncObj обязан быть конкретным типом, потому что конструкция X: Y так работает.
Это не баг, это недоработка. Не реализовано т.к. вычислять это всё очень сложно, когда речь идет не о конкретном кейсе а обобщенном решении.