Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to "strongify" optional self using guard in Swift 2.0

Tags:

swift

swift2

There's a similar question about how to weakify/strongify self, which is answered, but I'm wondering how to use "self" without rightward-drifting caused by if let:

Welcome to Apple Swift version 2.0 (700.0.59 700.0.72). Type :help for assistance.   2> import Foundation   3> class Foo {   4.     func guardOptSelf() -> () throws -> Void {   5.         return { [weak self] in   6.             guard let self = self else { throw NSError(domain: "I was destroyed!", code: 1, userInfo: nil) }   7.             self.doSomethingNonOptionalSelf()            8.         }   9.     }   10. } repl.swift:6:19: error: pattern matching in a condition requires the 'case' keyword             guard let self = self else { throw NSError(domain: "I was destroyed!", code: 1, userInfo: nil) }                   ^                   case repl.swift:6:23: error: binary operator '~=' cannot be applied to two 'Foo?' operands             guard let self = self else { throw NSError(domain: "I was destroyed!", code: 1, userInfo: nil) } 
like image 967
Brian Gerstle Avatar asked Sep 15 '15 14:09

Brian Gerstle


1 Answers

You can shadow self; you just need backticks to indicate that "you know what you're doing". For example:

foo.doSomethingAsyncWithBar(bar) { [weak self] result in     guard let `self` = self else { return }     self.receivedResult(result) } 

Or, in your example:

2> import Foundation 3> class Foo { 4.     func guardOptSelf() -> () throws -> Void { 5.         return { [weak self] in 6.             guard let `self` = self else { throw NSError(domain: "I was destroyed!", code: 1, userInfo: nil) } 7.             self.doSomethingNonOptionalSelf()          8.         } 9.     } 10. } 
like image 135
Jason Avatar answered Sep 18 '22 07:09

Jason