2016-09-10 18 views
1

私はこのシンプルなクラスと 'ShowAlert'という仮想プロトコルを持っています。これはデフォルトの実装とデフォルトのViewControllerとそのShowAlertプロトコル実装を拡張したものです。拡張の動作を維持するSwiftオーバーライドプロトコル拡張

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(」呼び出してから、私はそれの後にやりたいものは何でも実装し続けることができたサブクラスでのようなものです。

これを行う方法はありますか?あるいは、私の論理は、どんなプロトコルが設計されているのかと違って起こります。

答えて

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!") 
    } 
} 

あなたの代わりに.defaultShow().show()を呼び出すことができ、別の解決策もあります。ただし、キャスティングを使用し、カプセル化を中断します。あなたがそれを見たいと思ったら私に知らせてください。

+0

いいアイデアだが、私はSwiftが新しい機能を追加することなく、このような状況に対処する何かを持っていると考えていた。とにかくありがとう。 – RodolfoAntonici

関連する問題