<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="">On Mar 18, 2016, at 11:36 AM, Chris Willmore via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><div><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="" style="font-size: 12.8px;">typedef void (^CallbackBlock)(FDataSnapshot *snapshot);</div><div class="" style="font-size: 12.8px;"><br class=""></div><div class="" style="font-size: 12.8px;">The parameter in the block gets converted into a IUO, I ended up releasing an app that crashed due to that IUO being nil.</div><div class="" style="font-size: 12.8px;"><br class=""></div><div class="" style="font-size: 12.8px;">The code that crashed was something like this</div><div class="" style="font-size: 12.8px;"><br class=""></div><div class="" style="font-size: 12.8px;">object.observe {</div><div class="" style="font-size: 12.8px;">$0.doSomething()</div><div class="" style="font-size: 12.8px;">}</div><div class="" style="font-size: 12.8px;"><br class=""></div><div class="" style="font-size: 12.8px;">There is no way to tell that the $0 was a IUO. The compiler didn't force me to confirm in it in some way using a ! and unless I remembered to check the header I would have a crash.</div><div class="" style="font-size: 12.8px;"><br class=""></div><div class="" style="font-size: 12.8px;">How would this work under your proposal ?</div></div></div></blockquote><div class=""><br class=""></div>This is a great question. I think it would make the most sense to import the<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">CallbackBlock</font><span class="Apple-converted-space">&nbsp;</span>type as<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">(FDataSnapshot?) -&gt; ()</font>, since there’s no decl to hang the IUO attribute onto. Then<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">$0</font><span class="Apple-converted-space">&nbsp;</span>ends up with type<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">FDataSnapshot?</font><span class="Apple-converted-space">&nbsp;</span>(i.e.<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">Optional&lt;FDataSnapshot&gt;</font>), and the compiler would not allow you to simply call<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">doSomething()</font><span class="Apple-converted-space">&nbsp;</span>on<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">$0</font>&nbsp;without forcing it first.</div></div></div></blockquote><br class=""></div><div>I agree that this is the most straight-forward thing to do. &nbsp;Chris, please add a mention of this to the proposal so that the review discussion considers it. &nbsp;Thanks!</div><div><br class=""></div><div>-Chris</div><br class=""></body></html>