Latest R.swift release now build using SPM, instead of a cobbled together Xcode project with git submodules: https://github.com/mac-cain13/R.swift/releases/tag/v3.3.0
“Always program against an interface” is outdated advice from the days of Java and C#. This doesn’t apply in languages like Kotlin or Swift.
There’s no need to define an interface at the same time as a concrete type. With extensions, existing types can confirm to new interfaces.
Just program against concrete types, and only introduce a new interface when you actually need the indirection.