[swift-evolution] More flexible guard statement

Zef Houssney zefmail at gmail.com
Sat Dec 12 14:58:36 CST 2015


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`:

let col = tableView.columnWithIdentifier("MyColumn")
guard let tableView = self.tableView where col != -1 else {
  NSBeep()
  print("an error occurred")
  return
}

Zef



> On Dec 12, 2015, at 11:23 AM, Al Skipp via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 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
> 
> _______________________________________________
> 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