Skip to content

Instantly share code, notes, and snippets.

@patricklynch
Last active August 29, 2015 14:23
Show Gist options
  • Save patricklynch/8cd7d3175881101738b7 to your computer and use it in GitHub Desktop.
Save patricklynch/8cd7d3175881101738b7 to your computer and use it in GitHub Desktop.
Safer use of responder chain in Swift
import UIKit
protocol FollowResponder: NSObjectProtocol {
func followUser( completion:(()->())? )
func unfollowUser( completion:(()->())? )
}
extension UIResponder {
enum FollowAction: Selector {
case FollowUser = "followUser:"
case UnfollowUser = "unfollowUser:"
}
func targetForAction( followAction: FollowAction, withSender sender: AnyObject?) -> AnyObject? {
return self.targetForAction( followAction.rawValue, withSender: sender )
}
}
extension AppDelegate : FollowResponder {
func followUser( completion:(()->())? ) {
print( "Following user..." )
completion?()
}
func unfollowUser( completion:(()->())? ) {
print( "Unfollowing user..." )
completion?()
}
}
class FollowViewController: UIViewController {
@IBAction func onFollowButtonPressed( sender: AnyObject! ) {
guard let responder = self.targetForAction( .FollowUser, withSender: self ) as? FollowResponder else {
fatalError( "Unable to find FollowResponder in chain." )
}
responder.followUser {
print( "User has been followed." )
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment