Swift: escriba 'ViewController' no constring con el protocolo 'UIPageViewControllerDataSource'

Estoy usando Xcode 6 GM. Estoy intentando implementar este tutorial de controller de vista de página, pero en Swift en lugar de Objective-C, pero no está funcionando como se esperaba.

De hecho, he logrado encontrar un repository git donde alguien más está haciendo lo mismo, pero después de clonar su proyecto y abrirlo en Xcode, tiene los mismos errores que recibo. He logrado resolver la mayoría de ellos, excepto el problema de conformidad del protocolo al implementar el protocolo UIPageViewControllerDataSource.

Para ser honesto, no entiendo completamente el uso de ? y ! en Swift y si eso está causando mi problema. La eliminación de la ! de las variables en la implementación de los methods del protocolo causa otros errores.

¿Podría alguien ayudarme?

 class ViewController: UIViewController, UIPageViewControllerDataSource { var pageViewController : UIPageViewController? var pageTitles = ["Over 200 Tips and Tricks", "Discover Hidden Features", "Bookmark Favorite Tip", "FreeRegular Update"] var pageImages = ["page1.png", "page2.png", "page3.png", "page4.png"] var currentIndex = 0 @IBAction func startWalkthrough(sender: UIButton) { var startingViewController : PageContentViewController = self.viewControllerAtIndex(0)! var viewControllers : NSArray = [startingViewController] self.pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil) } override func viewDidLoad() { super.viewDidLoad() //Create page view controller self.pageViewController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil) self.pageViewController!.dataSource = self let startingViewController : PageContentViewController = self.viewControllerAtIndex(0)! let viewControllers: NSArray = [startingViewController] self.pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil) // Change the size of page view controller self.pageViewController!.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30); self.addChildViewController(self.pageViewController!) self.view.addSubview(self.pageViewController!.view) self.pageViewController!.didMoveToParentViewController(self) } func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! { var index = (viewController as PageContentViewController).pageIndex if index == 0 || index == NSNotFound { return nil } index!-- println("Decreasing Index: \(index)") return self.viewControllerAtIndex(index!) } func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! { var index = (viewController as PageContentViewController).pageIndex if index == NSNotFound { return nil } index!++ println("Increasing Index: \(index)") if index == self.pageTitles.count { return nil; } return self.viewControllerAtIndex(index!); } func viewControllerAtIndex(index : Int) -> PageContentViewController? { if self.pageTitles.count == 0 || index >= self.pageTitles.count { return nil; } // Create a new view controller and pass suitable data. let pageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as PageContentViewController pageContentViewController.imageFile = self.pageImages[index] pageContentViewController.titleText = self.pageTitles[index] pageContentViewController.pageIndex = index return pageContentViewController; } func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { return self.pageTitles.count } func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 } } 

Se debe a que el protocolo UIPageViewControllerDataSource tiene firmas de método actualizadas: está utilizando:

 func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! 

pero ahora son:

 func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? 

Cuando tenga dudas sobre un protocolo no conforme, un command + clic en el nombre del protocolo lo llevará a la statement del protocolo, donde puede ver si está implementando su interfaz correctamente.