The syntax is terse if you need to do arbitrary stuff with an arbitrary interface. But if you start off keeping SWIG in mind from the beginning and avoid funky features at API level you might be fine by just "importing" your header files in the SWIG-definition file.
See https://projects.om-office.de/frans/swig_demo/-/tree/master/... (disclaimer: very old and special exception handling)
IMHO this is a good practice anyway, because this way you make sure, your API looks the same in every binding.
And this way you get a binding for Python, Java, JavaScript, C#, Lua, and much more