2017-01-17 5 views
3

私はこのコードで、このquestionを見た:UIViewまたはUIViewControllerを直接拡張しないでください。

protocol Flashable {} 

extension Flashable where Self: UIView 
{ 
    func flash() { 
     UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: { 
      self.alpha = 1.0 //Object fades in 
     }) { (animationComplete) in 
      if animationComplete == true { 
       UIView.animate(withDuration: 0.3, delay: 2.0, options: .curveEaseOut, animations: { 
        self.alpha = 0.0 //Object fades out 
        }, completion: nil) 
      } 
     } 
    } 
} 

そして私はなぜあなただ​​けの直接ちょうどUIViewを拡張しないだろうか?または類似のケースでUIViewControllerはなぜwhere Self:

  • と周りにそれをねじる拡張私たちは私たちの意図を高め、他の開発者が来るとき、彼らはちょっとこのクラスはなどフラッシュ可能、調光、に準拠していることがわかりますように、それか?
  • また、私たちのUIViewには別の意味のある拡張機能がありますか? UIViewまたはUIViewControllerの異なるunNamed拡張の代わりに?
  • POPのこの件に関するアップルのガイドラインはありますか?私は、開発者がそれをやってこの方法を見て、それはプログラマがどのUIView決めることができますので、このアプローチは

    extension UIView { 
        func flash() { 
         ... 
        } 
    } 
    

    のように、直接UIViewを使用することが好ましい理由は...

+3

政府が「自己破壊」機能を備えた軍用ビルを建設していたとします。ビルディングの拡張機能として、この機能を実装したとします。今あなたの家( 'Buiding')はこの"自己破壊 "機能を継承します。それについてどう思いますか? – Alexander

答えて

5

のかわからないしました彼らはすべてのUIView秒にflash機能「卸売」を追加することとは反対に、Flashableをしたいサブクラス:

// This class has flashing functionality 
class MyViewWithFlashing : UIView, Flashable { 
    ... 
} 
// This class does not have flashing functionality 
class MyView : UIView { 
    ... 
} 

基本的に、これは「オプトイン」アプローチですが、代替アプローチでは「オプトアウト」する方法がなくても機能を実行できます。

+0

それを卸売りして何が問題になっていますか?そして、オプトアウトでは、正確に何を意味するのですか?私はUIViewを直接拡張したので、私はflash()という名前のpublic funcを別の場所に置くことができません。 – Honey

+2

@Honey卸売追加の問題は、flash()を呼び出すつもりがなかったビューでフラッシュ機能が利用できるようになり、コンパイラがこの状況を検出するのを手助けできなくなることです。この拡張は、まだコード化していないものを含む、すべてのUIView実装の一部になります。 「オプトアウトしない」とは、「拡張UIView」が配置されると、Swiftは「この特定のUIViewに点滅する機能を持たせたくない」という構文を提供しないということです。 – dasblinkenlight

+2

全くありません。 @dasblinkenlightはまさに彼が言ったことを意味しています。flash()は、この拡張子を持つすべての単一UIView(およびUIKitサブビュー)で使用できます。これについて考えてみましょう:このUIView拡張機能がサードパーティのプラグインの一部であった場合、または大規模なチームメンテナンスアプリの一部である場合は、どこから物事を文書化しますか?どこでオーバーライド機能を提供していますか?誰が知っていただろう?はい。これはUIViewレベルで拡張できます。しかし、おそらくあなたは他の場所でそれを行うべきです。 – dfd

関連する問題