I certainly hope that doesn't work.
URLSession is a universal client - applications can plug-in to it by registering subclasses of URLProtocol, which also allows them to add arbitrary data to URLRequests. In fact, it even supports loading requests when the URL is nil.
The cURL part of things comes about because URLSession includes default handlers for requests to particular URL schemes, such as http/s. If there is no registered handler for a request at the application level, the request should fail and return an unsupportedURL error (although SCF currently does not match Darwin behaviour and crashes - see this PR).
Regardless, it should not just be throwing things at cURL and seeing what gets accepted/rejected.
You should go with the struct or tuple.
The way applications like this usually work is that the URL expresses things such as the host and port (and other data), and the first thing the application does is extract those as separate values. The URL is just a convenient string format which lets you pack that information together -- but for actually processing them, you'll want to split them in to separate pieces of data.
The irc: (and ircs:) URL schemes are not incredibly well-defined, but they allow packing in more information than just the host and port. I managed to find a couple of websites describing the generally-accepted format and options, by googling the phrase "irc URL scheme":
You may want to eventually support some of the other data from those formats. For example:
Connect to #channel1 and #channel2 using SSL:
ircs://irc.example.com:6697/#channel1,#channel2
Again, you'd start with a URL (perhaps from an external source, like Safari), unpack the data in to a struct, then use it to figure out which host to connect to which channels to connect to, etc.