<div dir="ltr">I have several <span style="font-family:monospace,monospace">public</span> structs that conform to this <span style="font-family:monospace,monospace">internal</span> protocol. The protocol has an associated type <span style="color:rgb(103,78,167)"><span style="font-family:monospace,monospace">IntV</span></span> so that it can service 2, 3, or 4 dimensional noise.<br><div><br><span style="font-family:monospace,monospace"><span style="color:rgb(255,0,255)">protocol</span> HashedTilingNoise<br>{<br>    <span style="color:rgb(255,0,255)">associatedtype</span> <span style="color:rgb(103,78,167)">IntV</span><br><br>    <span style="color:rgb(255,0,255)">var</span> amplitude:<span style="color:rgb(166,77,121)">Double</span> { <span style="color:rgb(255,0,255)">get</span> }<br>    <span style="color:rgb(255,0,255)">var</span> frequency:</span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(166,77,121)">Double</span></span> { </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(255,0,255)">get</span></span> }<br>    <span style="color:rgb(255,0,255)">var</span> wavelengths:</span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(103,78,167)">IntV</span></span> { </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(255,0,255)">get</span></span> }<br><br>    init(amplitude:</span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(166,77,121)">Double</span></span>, frequency:</span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(166,77,121)">Double</span></span>, wavelengths:</span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(103,78,167)">IntV</span></span>)<br>}</span><br><br></div><div>I extend it to provide common functionality for all the conforming structs.<br></div><div><br><span style="font-family:monospace,monospace"><span style="color:rgb(255,0,255)">extension</span> HashedTilingNoise<br>{<br>    <span style="color:rgb(153,0,255)">public</span><br>    <span style="color:rgb(255,0,255)">func</span> amplitude_scaled(by factor:</span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(166,77,121)">Double</span></span>) -&gt; <span style="color:rgb(61,133,198)">Self</span><br>    {<br>        <span style="color:rgb(255,0,0)">return</span> <span style="color:rgb(61,133,198)">Self</span>(amplitude: <span style="color:rgb(61,133,198)">self</span>.amplitude * factor, frequency: </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.frequency, wavelengths: </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.wavelengths)<br>    }<br><br>    <span style="color:rgb(153,0,255)">public</span><br>    <span style="color:rgb(255,0,255)">func</span> frequency_scaled(by factor:</span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(166,77,121)">Double</span></span>) -&gt; </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">Self<br></span></span></span>    {<br>        <span style="color:rgb(255,0,0)">return</span> </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">Self</span></span>(amplitude: </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.amplitude, frequency: </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.frequency * factor, wavelengths: </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.wavelengths)<br>    }<br>    <br>    ...<br>}</span><br><br></div><div>But now I want to provide common functionality just for structs with a certain dimension. For example, I want to provide a <span style="font-family:monospace,monospace">transpose(octaves:)</span> function for the structs that have 3 dimensional <span style="font-family:monospace,monospace">wavelengths</span>.<br></div><div><br><span style="font-family:monospace,monospace"><span style="color:rgb(255,0,255)">extension</span> HashedTilingNoise <span style="color:rgb(255,0,255)">where</span> </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(103,78,167)">IntV</span></span> == <span style="color:rgb(166,77,121)">Math</span>.<span style="color:rgb(166,77,121)">IntV3</span><br>{<br>    </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(153,0,255)">public</span><br>    <span style="color:rgb(255,0,255)">func</span></span> transposed(octaves:<span style="color:rgb(166,77,121)">Int</span>) -&gt; <span style="color:rgb(61,133,198)">Self</span><br>    {<br>        <span style="color:rgb(255,0,0)">return</span> </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">Self</span></span>(amplitude: </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.amplitude, frequency: </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.frequency,<br>                    wavelengths: (</span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.wavelengths.a &lt;&lt; octaves, </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.wavelengths.b &lt;&lt; octaves, </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="color:rgb(61,133,198)">self</span></span>.wavelengths.c &lt;&lt; octaves))<br>    }<br></span></div><div><span style="font-family:monospace,monospace">}</span><br><br></div><div>But this gives the compiler error<br><br><span style="font-family:monospace,monospace">/home/taylorswift/noise/sources/noise/hash.swift:67:5: <span style="color:rgb(204,0,0)">error</span>: cannot declare a public instance method in an extension with internal requirements<br>    public <br>    ^~~~~~<br>    internal</span><br><br></div><div>Because the <span style="font-family:monospace,monospace"><span style="color:rgb(166,77,121)">Math</span>.<span style="color:rgb(166,77,121)">IntV3</span></span><span style="font-family:monospace,monospace"></span> type and the <span style="color:rgb(166,77,121)"><span style="font-family:monospace,monospace">HashedTilingNoise</span></span> protocol are internal. I don’t want to expose these as part of the API as they are just containers for shared functionality.<br><br></div><div>How do I fix this?<br></div></div>