Skip to content

Instantly share code, notes, and snippets.

@atetlaw
Last active September 11, 2015 03:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atetlaw/65aacfcc6d80af89fbd3 to your computer and use it in GitHub Desktop.
Save atetlaw/65aacfcc6d80af89fbd3 to your computer and use it in GitHub Desktop.
A silly Swift protocol so you can use an Enum's values to identify storyboard segues
import UIKit
protocol SegueNaming: RawRepresentable {
static func handle<T : SegueNaming>(segue: UIStoryboardSegue, f: T -> Void)
init?(withSegue: UIStoryboardSegue)
var segueIdentifier: String { get }
}
extension SegueNaming where Self.RawValue == String {
static func handle<T:SegueNaming>(segue: UIStoryboardSegue, f: T -> Void) {
if let segueNameValue = T(withSegue: segue) {
f(segueNameValue)
}
}
init?(withSegue: UIStoryboardSegue) {
if let identifier = withSegue.identifier {
self.init(rawValue: identifier)
} else {
return nil
}
}
var segueIdentifier: String {
return self.rawValue
}
}
extension UIViewController {
func performSegueWithSegueName<T:SegueNaming>(segueName: T, sender: AnyObject?) {
self.performSegueWithIdentifier(segueName.segueIdentifier, sender: sender)
}
}
@atetlaw
Copy link
Author

atetlaw commented Aug 23, 2015

Make an enum

enum MySegue: String, SegueNaming {
    case ShowDetailViewController, ShowEditingViewController
}

Then you can use it like this in prepareForSegue(_:):

if let segueName = MySegue(withSegue: segue) {
    switch segueName {
        case .ShowDetailViewController:
        ...
        case .ShowEditingViewController:
        ...
    }
}

Or else you can do this:

MySegue.handle(segue) { (segueName: MySegue)  in
    switch segueName {
        case .ShowDetailViewController:
            ...
        case .ShowEditingViewController:
            ...
    }
}

there's also a UIViewController extension so you can call:
self.performSegueWithSegueName(MySegue.ShowDetailViewController, sender: sender)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment