<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">The problem is still, how would I call the controller method? I still can&#39;t instantiate a new instance of the controller and call a given method on the instance.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">I was able to partially get this working, but I realized that I still can&#39;t instantiate a new controller on each request. I can&#39;t figure out a good way to store the class method</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><br></div><div><div style="color:rgb(136,136,136);font-size:12.8000001907349px;max-width:600px;direction:ltr"><div style="max-width:470px;margin:8px 8px 0px 0px"><table border="0" cellspacing="0" cellpadding="0" width="470" style="width:470px"><tbody><tr valign="top"><td style="font-family:Arial;font-stretch:normal;font-size:14px;color:rgb(100,100,100);padding-left:10px"><div><b>Matthew Davies</b><br>Junior Developer, <a href="http://geostrategies.com" target="_blank">GeoStrategies</a></div><div>Director of Photography, <a href="http://offblockfilms.com" target="_blank">OffBlock Films</a></div><div style="color:rgb(141,141,141);font-size:13px;padding:5px 0px"><a href="tel:209-225.3246" style="color:rgb(141,141,141);text-decoration:none" target="_blank">209-225-3246</a> <span style="color:rgb(102,102,102);display:inline-block">|</span> <span style="display:inline-block"><a href="tel:209-202-3284" style="color:rgb(141,141,141);text-decoration:none" target="_blank">209-202-3284</a></span> <span style="color:rgb(102,102,102);display:inline-block">|</span> <span style="display:inline-block"><a href="mailto:daviesgeek@gmail.com" style="color:rgb(141,141,141);text-decoration:none" target="_blank">daviesgeek@gmail.com</a></span> <span style="color:rgb(102,102,102);display:inline-block">|</span> <span style="white-space:nowrap;display:inline-block"><a href="https://daviesgeek.com/" style="color:rgb(141,141,141);text-decoration:none" target="_blank">daviesgeek.com</a></span></div><div style="margin-top:5px"><a href="http://facebook.com/daviesgeek" style="color:rgb(17,85,204)" target="_blank"><img src="https://s3.amazonaws.com/images.wisestamp.com/icons/facebook.png" width="16" height="16"></a> <a href="http://us.linkedin.com/in/daviesgeek" style="color:rgb(17,85,204)" target="_blank"><img src="https://s3.amazonaws.com/images.wisestamp.com/icons/linkedin.png" width="16" height="16"></a> <a href="http://twitter.com/daviesgeek" style="color:rgb(17,85,204)" target="_blank"><img src="https://s3.amazonaws.com/images.wisestamp.com/icons/twitter.png" width="16" height="16"></a> <a href="http://daviesgeek.com/feed.xml" style="color:rgb(17,85,204)" target="_blank"><img src="https://s3.amazonaws.com/images.wisestamp.com/icons/blogRSS.png" width="16" height="16"></a>  <a href="http://github.com/daviesgeek" style="color:rgb(17,85,204)" target="_blank"><img src="https://s3.amazonaws.com/images.wisestamp.com/icons/github.png" width="16" height="16"></a></div></td></tr></tbody></table></div><br></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
<br><div class="gmail_quote">On Fri, Dec 11, 2015 at 8:14 AM, Jeremy Pereira <span dir="ltr">&lt;<a href="mailto:jeremy.j.pereira@googlemail.com" target="_blank">jeremy.j.pereira@googlemail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On 10 Dec 2015, at 20:22, Matthew Davies via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; I&#39;m building a URL router in which I&#39;d like to pass a controller and a method. I don&#39;t want to instantiate all the controllers up front and pass the methods in as closures, nor do I want old controller instances still kept around. If there&#39;s a better way, I&#39;m definitely open to any suggestions. I&#39;m still learning the &quot;Swift&quot; way to do things.<br>
<br>
</span>The way I would do this is to define my controller interface with a protocol and then have a dictionary of the following type:<br>
<br>
        [String: (Request) throws -&gt; Controller]<br>
<br>
where Controller is the protocol and Request is the HTTP request.<br>
<br>
So you have a dictionary of URLs to functions (or closures) that create instances that conform to the Controller protocol. The closure takes a parameter of the HTTP request so it has the option of choosing the returned instance based on the method or headers or parameters in the request.<br>
<br>
In my implementation, I took the path part of the URL and if it was in the dictionary it would use the returned closure to create the controller. If it wasn’t there, I chopped off the last path part and tried again and so on until I was left with “/“ which always maps to a controller.<br>
<br>
The closure is allowed to throw so I could put something like this in for a path<br>
<br>
    { _ in throw HTTPError(404) }<br>
<br>
which would be handled further up the call chain by generating a 404 response.<br>
<br>
<br>
</blockquote></div><br></div>