UIViewController的自约束协议扩展

时间:2017-08-10 12:41:19

标签: swift swift2 swift-protocols

我正在研究一个传统的Swift 2.2项目,我想在我的代码中实现一些众所周知的面向协议的实践。

protocol SuccessPresenting {
    func presentSucess(title: String, message: String)
}

extension SuccessPresenting where Self: UIViewController {
    func presentSucess(title: String?, message: String) {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        let dismissAction = UIAlertAction(title: "ОК", style: .Default, handler: nil)
        alertController.addAction(dismissAction)
        self.presentViewController(alertController, animated: true, completion: nil)
    }
}

class NewViewController: UIViewController, SuccessPresenting {

   func foo() {
      presentSucess(nil, message: "Done!")
   }
}

虽然,它适用于Swift 3.1,但我收到一个错误:The NewViewController doesn't conform to protocol SuccessPresenting

但是为什么我应该在我的VC中编写协议实现,因为我已经使用协议扩展做了? 我会感激任何帮助。 请注意,这是Swift 2.2

1 个答案:

答案 0 :(得分:1)

这是直接粘贴吗?因为您的extension包含可选而非常规字符串,而您的协议包含正常String。这可能会导致编译器认为它是一种不同的方法,在这种特殊情况下使协议的optionallness无效。