[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