<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On Oct 19, 2016, at 5:50 AM, David Goodine via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hey all,<div class=""><br class=""></div><div class="">I don’t know if this is really an ‘evolution’ topic per se, and I’m not on Swift Dev, but thought someone here could shed some light on this.</div><div class=""><br class=""></div><div class="">Often when developing code, if I need create mode switches (constant Bools) so that I can move back and forth between different features/implementations for testing, developing experimental features, migration, etc. &nbsp;Currently if I write the following:</div><div class=""><br class=""></div><div class=""><font face="Courier" class="">let useFoo = true</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class="">if useFoo {</font></div><div class=""><font face="Courier" class="">// Foo code</font></div><div class=""><font face="Courier" class="">} else {</font></div><div class=""><font face="Courier" class="">// Non-Foo code</font></div><div class=""><font face="Courier" class="">}</font></div><div class=""><br class=""></div><div class="">I will get compiler warnings either way that there’s unreachable code based on the value of useFoo. &nbsp;That makes sense in most cases, but in some cases I need to leave the code as is for a while, and I hate leaving long-standing compiler warnings in production code. &nbsp;(If it’s yellow, you need to pay attention to it.) &nbsp;So I poked around and discovered that if I use the following declaration of useFoo, the warnings go away.</div><div class=""><br class=""></div><div class=""><font face="Courier" class="">let useFoo = { return true }()</font></div><div class=""><br class=""></div><div class="">So, the question is, is this intentional? The compiler could certainly ascertain that useFoo will always be true and carry out the same dead code detection as for the first declaration. &nbsp;If this isn’t intentional, and the compiler may at some point optimize away the closure and trigger dead code warnings, I might come up with a proposal that there is some idiom that allows one to do the above without the warnings. &nbsp;I’m really not a fan of #define (because it’s just butt-ugly in such a beautiful language), but its existence is unavoidable for some cases. &nbsp;</div><div class=""><br class=""></div><div class="">And, as I write this, I realized I haven’t tried declaring useFoo as var, but I expect that would trigger a warning that useFoo is not modified and should be defined by let. &nbsp;I think this is a use case that, for practical purposes, should be covered to allow this type of evolution of code without generating warnings. &nbsp;If the current behavior is intentional and going to stay, then that’s probably the best solution.</div><div class=""><br class=""></div><div class="">-d</div></div></div></blockquote></div><br class=""><div class="">You should use Active Compilation Conditions to create flags for conditional compilation you can check with #if. If you’re not yet using Xcode 8, you can manually define the flags under the Other Swift Flags build setting (e.g., -DUSEFOO).</div><div class=""><br class=""></div><div class="">Preston</div></body></html>