<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="">The first line of your example would need to use <font face="Menlo" class="">self.tableView</font>, which is optional, so <font face="Menlo" class="">col</font> would be optional as well. The assignment happens after the unwrap.<div class=""><br class=""></div><div class="">I find this a lot in my code where I need to chain together a string of optional unwrapping and assignment from those optionals, like so:</div><div class=""><br class=""></div><div class=""></div><blockquote type="cite" class=""><div class=""><font face="Menlo" class="">if let foo = foo, bar = foo.bar, baz =foo.baz {</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">}</font></div></blockquote><div class=""><br class=""></div><div class="">In that case, if <font face="Menlo" class="">bar</font> is a non-optional property of <font face="Menlo" class="">foo</font>, I need to rewrite it like this:</div><div class=""><br class=""></div><div class=""></div><blockquote type="cite" class=""><div class=""><font face="Menlo" class="">if let foo = foo, baz = foo.baz {</font></div><div class=""><font face="Menlo" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let bar = foo.bar</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">}</font></div></blockquote><div class=""><br class=""></div><div class="">These examples aren’t too bad, but as you add more layers of unwrapping, it gets more difficult to do without multiple levels of indentation—though this is probably more a code smell than anything else.<br class=""><div class=""><br class=""></div><div class=""><br class=""><div class="">
<div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;  "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div class="">Jeff Kelley</div><div class=""><br class=""></div><div class=""><a href="mailto:SlaunchaMan@gmail.com" class="">SlaunchaMan@gmail.com</a>&nbsp;|&nbsp;<a href="https://twitter.com/SlaunchaMan" class="">@SlaunchaMan</a>&nbsp;|&nbsp;<a href="http://jeffkelley.org" class="">jeffkelley.org</a></div></div></span></div></div></div>
</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On Dec 12, 2015, at 3:58 PM, Zef Houssney 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=""><div class="">Jacob, you actually don’t need to have the redundant guard statement. If you want to assign something to a constant or variable, you just do that before the `guard let`, and you can still use it in the `where`:<br class=""><br class="">let col = tableView.columnWithIdentifier("MyColumn")<br class="">guard let tableView = self.tableView where col != -1 else {<br class=""> &nbsp;NSBeep()<br class=""> &nbsp;print("an error occurred")<br class=""> &nbsp;return<br class="">}<br class=""><br class="">Zef<br class=""><br class=""><br class=""><br class=""><blockquote type="cite" class="">On Dec 12, 2015, at 11:23 AM, Al Skipp via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class="">How about extending ‘NSTableView’ with a subscript?<br class=""><br class="">extension NSTableView {<br class=""> subscript(columnID columnID: String) -&gt; Int? {<br class=""> &nbsp;&nbsp;get {<br class=""> &nbsp;&nbsp;&nbsp;&nbsp;let c = columnWithIdentifier(columnID)<br class=""> &nbsp;&nbsp;&nbsp;&nbsp;return c &gt;= 0 ? c : .None<br class=""> &nbsp;&nbsp;}<br class=""> }<br class="">}<br class=""><br class="">tableView[columnID: "MyColumn"]<br class=""><br class=""><br class="">It doesn’t address the general case, but it does introduce a more Swifty way of dealing with non-existent return values in this use case and would enable you to use it with guard.<br class=""><br class="">Al<br class=""><br class=""><blockquote type="cite" class="">On 12 Dec 2015, at 17:43, Jakob Egger via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class="">At the moment "guard let" can only be used for unwrapping optionals. It<br class="">would be really nice if it could also be used with non-optional values.<br class="">For example, I'd like to write code like the following<br class=""><br class="">guard <br class=""> &nbsp;let tableView = self.tableView,<br class=""> &nbsp;let col = tableView.columnWithIdentifier("MyColumn") where col != -1<br class="">else {<br class=""> &nbsp;NSBeep()<br class=""> &nbsp;print("an error occurred")<br class=""> &nbsp;return<br class="">}<br class=""><br class="">This is not possible, because the second let assignment is non-optional,<br class="">so I have to write it like this:<br class=""><br class="">guard let tableView = self.tableView else {<br class=""> &nbsp;NSBeep()<br class=""> &nbsp;print("an error occurred")<br class=""> &nbsp;return<br class="">}<br class="">let col = tableView.columnWithIdentifier("MyColumn")<br class="">guard col != -1 else {<br class=""> &nbsp;NSBeep()<br class=""> &nbsp;print("an error occurred")<br class=""> &nbsp;return<br class="">}<br class=""><br class="">This leads to a lot of duplicated error handling code.<br class=""><br class="">Ideally, I'd also like to mix let &amp; where clauses in a single guard<br class="">statement, like this:<br class=""><br class="">guard <br class=""> &nbsp;let tableView = self.tableView,<br class=""> &nbsp;let col = tableView.columnWithIdentifier("MyColumn") where col !=<br class=""> &nbsp;-1,<br class=""> &nbsp;let headerCell = tableView.tableColumns[col].headerCell as?<br class=""> &nbsp;MyTableHeaderCell<br class="">else {<br class=""> &nbsp;NSBeep()<br class=""> &nbsp;print("an error occurred")<br class=""> &nbsp;return<br class="">}<br class=""><br class="">What do you think? Right now I always end up writing a lot of separate<br class="">guard statement, and I have a lot of repeated error handling code.<br class=""><br class=""><br class="">Best regards,<br class="">Jakob<br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></blockquote><br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></blockquote><br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></div></blockquote></div><br class=""></div></div></body></html>