<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I’m making a little utility struct that needs to be able to wrap an arbitrary value, which may be an optional, and be able to tell whether it’s nil. So I declared it like this (I’ve removed the interesting/useful parts of the code leaving just the constructors and one property):</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">public</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">struct</span><span style="font-variant-ligatures: no-common-ligatures" class=""> check&lt;T&gt; {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures;" class="">&nbsp; &nbsp;&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">let</span><span style="font-variant-ligatures: no-common-ligatures;" class="">&nbsp;actual:&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(52, 56, 146);" class="">T</span><span style="font-variant-ligatures: no-common-ligatures;" class="">?</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">public</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">init</span><span style="font-variant-ligatures: no-common-ligatures" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">_</span><span style="font-variant-ligatures: no-common-ligatures" class=""> a: </span><span style="font-variant-ligatures: no-common-ligatures; color: #343892" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">) {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #814100" class="">actual</span><span style="font-variant-ligatures: no-common-ligatures" class=""> = a</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">public</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">init</span><span style="font-variant-ligatures: no-common-ligatures" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">_</span><span style="font-variant-ligatures: no-common-ligatures" class=""> a: </span><span style="font-variant-ligatures: no-common-ligatures; color: #343892" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">?) {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #814100" class="">actual</span><span style="font-variant-ligatures: no-common-ligatures" class=""> = a</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures;" class="">&nbsp; &nbsp;&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">public</span><span style="font-variant-ligatures: no-common-ligatures;" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">var</span><span style="font-variant-ligatures: no-common-ligatures;" class=""> isNil: </span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(112, 61, 170);" class="">Bool</span><span style="font-variant-ligatures: no-common-ligatures;" class=""> {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">return</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #814100" class="">actual</span><span style="font-variant-ligatures: no-common-ligatures" class=""> == </span><span style="font-variant-ligatures: no-common-ligatures; color: #005493" class="">nil</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div></div></blockquote><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;" class=""><br class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span></div></div><div class="">This works fine, except when I try to use it with a value of type `Any?`:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">let</span><span style="font-variant-ligatures: no-common-ligatures;" class="">&nbsp;str:&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(112, 61, 170);" class="">String</span><span style="font-variant-ligatures: no-common-ligatures;" class="">&nbsp;=&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(121, 121, 121);" class="">"Hi"</span></div></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; color: rgb(129, 65, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(52, 56, 146);" class="">check</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 0, 0);" class="">(</span><span style="font-variant-ligatures: no-common-ligatures;" class="">str</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 0, 0);" class="">).</span><span style="font-variant-ligatures: no-common-ligatures;" class="">isNil<span class="Apple-tab-span" style="white-space:pre">                </span>// false</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">let</span><span style="font-variant-ligatures: no-common-ligatures;" class="">&nbsp;maybe:&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(112, 61, 170);" class="">String</span><span style="font-variant-ligatures: no-common-ligatures;" class="">? =&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">nil</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; color: rgb(129, 65, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(52, 56, 146);" class="">check</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 0, 0);" class="">(</span><span style="font-variant-ligatures: no-common-ligatures;" class="">maybe</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 0, 0);" class="">).</span><span style="font-variant-ligatures: no-common-ligatures;" class="">isNil<span class="Apple-tab-span" style="white-space:pre">                </span>// true</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">let</span><span style="font-variant-ligatures: no-common-ligatures;" class="">&nbsp;hmm:&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">Any</span><span style="font-variant-ligatures: no-common-ligatures;" class="">? =&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(0, 84, 147);" class="">nil</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(52, 56, 146);" class="">check</span><span style="font-variant-ligatures: no-common-ligatures;" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(129, 65, 0);" class="">hmm</span><span style="font-variant-ligatures: no-common-ligatures;" class="">).isNil<span class="Apple-tab-span" style="white-space:pre">                </span>// Error: “Ambiguous use of ‘init'"</span></div></div></blockquote><div class=""><br class=""></div><div class="">(I agree that `Any?` is sort of a weird type; in my code it represents a value that might be a JSON object. NSJSONSerialization parses to type `Any`, but there might not be a value, so it becomes an Optional&lt;Any&gt; or Any?.)</div><div class=""><br class=""></div><div class="">This worked in Swift 2.2, but after upgrading to Swift 3 [in the latest Xcode 8 beta] the compiler started complaining.</div><div class=""><br class=""></div><div class="">How can I fix the `check` struct's constructor(s) to make this work?</div><div class=""><br class=""></div><div class="">—Jens</div></body></html>