OK, based on the code that Michael pointed out, I wrote some Swift (1.2) code to do the same thing. You can add this as an extension to UIViewController (as I did), UIApplication, or for that matter simply make it a global function.
extension UIViewController {
    static func getVisibleViewController () -> UIViewController {
        let rootViewController = UIApplication.sharedApplication().keyWindow?.rootViewController
        return getVisibleViewControllerFrom(rootViewController!)
    }
    static func getVisibleViewControllerFrom(viewController: UIViewController) -> UIViewController {
        let vcToReturn: UIViewController
        if let navController = viewController as? UINavigationController {
            vcToReturn = UIViewController.getVisibleViewControllerFrom(navController.visibleViewController)
        }
        else if let tabBarController = viewController as? UITabBarController {
            vcToReturn = UIViewController.getVisibleViewControllerFrom(tabBarController.selectedViewController!)
        }
        else {
            if let presentedViewController = viewController.presentedViewController {
                vcToReturn = UIViewController.getVisibleViewControllerFrom(presentedViewController)
            }
            else {
                vcToReturn = viewController
            }
        }
        return vcToReturn
    }
}
You'd call this in the following way:
let visibleViewController = UIViewController.getVisibleViewController()
Hope this helps.
Andrew
PS I haven't tried this in Swift 2.0 yet, so I can't guarantee it will work without issues there. I know it won't work (as written) in Swift 1.1 or 1.0.