Swift重写协议扩展保持扩展行为

时间:2016-09-10 17:07:02

标签: ios swift swift2 protocols

我有这个简单的类和一个名为'ShowAlert'的假设协议,它是执行默认实现的扩展,默认的ViewController和它的ShowAlert协议实现。

protocol ShowAlert {
    var titleForAlert: String! { get }
    func messageForAlert() -> String!
    func show()
}

extension ShowAlert where Self: UIViewController {

    func show(){
        let alert = UIAlertController(title: self.titleForAlert, message: self.messageForAlert(), preferredStyle: .Alert)
        alert.addAction(UIAlertAction(title: "Ok", style: .Cancel, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }


    @IBAction func showItNow(sender: AnyObject) {
        self.show()
    }



}

extension ViewController: ShowAlert {
    var titleForAlert: String! {
        get{
            return "Foo"
        }
    }


    func messageForAlert() -> String! {
        return "Bar"
    }

    func show() {
    // here I want to call the default implementation of the protocol to show the alert, then do something else
        print("Good day sir!")
    }
}

就像在子类中我可以调用'super.show()'然后继续实现我想要做的任何事情。

有什么办法吗?或者我的逻辑违背了设计的协议,并且不会发生这种情况?

1 个答案:

答案 0 :(得分:3)

有一个简单的解决方案:只需在扩展程序中添加defaultShow方法即可。

extension ShowAlert where Self: UIViewController {

    func defaultShow(){
        let alert = UIAlertController(title: self.titleForAlert, message: self.messageForAlert(), preferredStyle: .Alert)
        alert.addAction(UIAlertAction(title: "Ok", style: .Cancel, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }

    func show() {
        defaultShow()
    }
}

因此,在您的代码中,您只需拨打defaultShow

即可
extension ViewController: ShowAlert {
    // ...

    func show() {
        self.defaultShow()
        print("Good day sir!")
    }
}

还有另一种解决方案,您可以拨打.show()而不是.defaultShow()。然而,它使用铸造和破坏封装。如果你想看到它,请告诉我。