<div dir="ltr"><div><span style="font-size:12.8px">Several people have already agreed that &#39;inout&#39; should be placed before types in parameter lists:</span></div><div><span style="font-size:12.8px"><br></span></div><span style="font-size:12.8px">func foo(x: inout Int)</span><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">I&#39;m strongly against such a change an will explain why.<br></span><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">&#39;The Swift Programming Language&#39; states that there are 2 distinct kinds of modifiers:</span></div><div><span style="font-size:12.8px">1. Declaration attributes</span></div><div><span style="font-size:12.8px">2. Type attributes</span></div><div><br></div><div>Declaration attributes, specifically @autoclosure and @noescape, have no meaning outside function parameter lists. They are therefore placed before the variables themselves to visually differentiate them from actual type attributes.</div><div><br></div><div>Type attributes, specifically @convention and @noreturn, are applied to types. They are true type modifiers, and form a new type that can be used everywhere a normal type can.</div><div><br></div><div>For example, I can declare a @convention(c) variable</div><div>let test: @convention(c) Int -&gt; Void</div><div>But I cannot declare an @autoclosure variable:</div><div>let test: @autoclosure () -&gt; Bool</div><div>And that&#39;s OK because @autoclosure makes no sense here. It is not a type attribute at all.</div><div><br></div><div>Now look at &#39;inout&#39;. Currently, &#39;inout&#39; is (semantically) a declaration attribute. We cannot return inout from function, we cannot declare an inout variable. &#39;inout&#39; only makes sense in parameter lists. We should then treat it like @autoclosure and not like @convention(c). It should then be placed like them, i.e. before the parameter itself, like it is placed now.</div><div><br></div><div>TLDR: &#39;inout&#39; is placed before parameters for consistency with (other) declaration attributes. (Parameter) declaration attributes are placed before parameters to hint that they make sense only in parameter lists.</div><div><br></div><div>Another question is if we change &#39;inout&#39; to act like a type attribute, essentially adding C++-style references to Swift. Only then would it be logical to place &#39;inout&#39; before types.</div><div>It seems like there is no corresponding thread yet. I&#39;m personally against it. If some people think otherwise, we could start a new thread.</div></div></div>