<div dir="ltr"><div>Hello all, I&#39;m interested in a pattern to return failure, together with an error</div><div>to explain why. I think that the &quot;guard let x = x&quot; discussion touched on the issue,</div><div>but didn&#39;t really go in that direction.</div><div><br></div><div>Right now, optional and boolean results work nicely with guards, but you only get</div><div>sucess/failure back. For example:</div><div><br></div><div>func foo() -&gt; Int?</div><div>func bar() -&gt; Bool</div><div>func baz(Int) -&gt; Int?</div><div><br></div><div>guard</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>let a = foo(),</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>bar(),</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>let b = baz(a)</div><div>else {</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>// No information about what failed here</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>print(&quot;Something failed&quot;)</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>return</div><div>}</div><div><br></div><div>I see a lot of enum Result solutions being proposed, but they have the fundamental</div><div>problem of not having access to the error inside guards. For example:</div><div><br></div><div>enum Result&lt;T&gt; { case sucess(T), error(String) }</div><div><br></div><div>func foo() -&gt; Result&lt;Int&gt;</div><div><br></div><div>guard case let .success(value) = foo() else {</div><div>    // Result is .error but we have no access to the error message here</div><div>    return</div><div>}</div><div><br></div><div>I think a solution to this problem could be to allow &quot;guard let try&quot; statements</div><div>that make the error available inside the else statement. So you could write:</div><div><br></div><div>func foo() throws -&gt; Int</div><div>func bar() -&gt; Bool</div><div>func baz(Int) throws -&gt; Int</div><div><br></div><div>guard</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>let a = try foo(),</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>bar(),</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>let b = try baz(a)</div><div>else {</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>// `error` is available here like in a catch block</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>print(&quot;Error: \(error.localizedDescription)&quot;)</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>return</div><div>}</div><div><br></div><div>A potential weirdness of this solution is that it appears indistinguishable from</div><div>&quot;guard let try?&quot; (already available) if you are not interested in the error.</div><div><br></div><div>Thoughts?</div><div><br></div></div>