[swift-evolution] More flexible guard statement

Al Skipp al_skipp at fastmail.fm
Sat Dec 12 12:23:43 CST 2015


How about extending ‘NSTableView’ with a subscript?

extension NSTableView {
  subscript(columnID columnID: String) -> Int? {
    get {
      let c = columnWithIdentifier(columnID)
      return c >= 0 ? c : .None
    }
  }
}

tableView[columnID: "MyColumn"]


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.

Al

> On 12 Dec 2015, at 17:43, Jakob Egger via swift-evolution <swift-evolution at swift.org> wrote:
> 
> At the moment "guard let" can only be used for unwrapping optionals. It
> would be really nice if it could also be used with non-optional values.
> For example, I'd like to write code like the following
> 
> guard 
>    let tableView = self.tableView,
>    let col = tableView.columnWithIdentifier("MyColumn") where col != -1
> else {
>    NSBeep()
>    print("an error occurred")
>    return
> }
> 
> This is not possible, because the second let assignment is non-optional,
> so I have to write it like this:
> 
> guard let tableView = self.tableView else {
>    NSBeep()
>    print("an error occurred")
>    return
> }
> let col = tableView.columnWithIdentifier("MyColumn")
> guard col != -1 else {
>    NSBeep()
>    print("an error occurred")
>    return
> }
> 
> This leads to a lot of duplicated error handling code.
> 
> Ideally, I'd also like to mix let & where clauses in a single guard
> statement, like this:
> 
> guard 
>    let tableView = self.tableView,
>    let col = tableView.columnWithIdentifier("MyColumn") where col !=
>    -1,
>    let headerCell = tableView.tableColumns[col].headerCell as?
>    MyTableHeaderCell
> else {
>    NSBeep()
>    print("an error occurred")
>    return
> }
> 
> What do you think? Right now I always end up writing a lot of separate
> guard statement, and I have a lot of repeated error handling code.
> 
> 
> Best regards,
> Jakob
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution



More information about the swift-evolution mailing list