2016-08-23 5 views
1

を継承しないクラス全体で計算されたプロパティ:スウィフト:共有方法と、私は3つのスウィフトクラスき互い

@IBDesignable class CustomTextField : UITextField { 

    @IBInspectable var borderColor: UIColor = UIColor.clearColor() { 
    didSet { 
     layer.borderColor = borderColor.CGColor 
    } 
    } 

} 

@IBDesignable class CustomView : UIView { 

    @IBInspectable var borderColor: UIColor = UIColor.clearColor() { 
    didSet { 
     layer.borderColor = borderColor.CGColor 
    } 
    } 

} 

@IBDesignable class CustomButton : UIButton { 

    @IBInspectable var borderColor: UIColor = UIColor.clearColor() { 
    didSet { 
     layer.borderColor = borderColor.CGColor 
    } 
    } 

} 

すべての3つのクラスが同じ計算されたプロパティ(BORDERCOLOR)を持っています。 私はDRY(繰り返しはしません)し、そのような繰り返しの計算されたプロパティやメソッドをどこかから継承したいと思っています。それを行う方法はありますか?

私は、プロトコルの拡張機能とプロトコルメソッドのデフォルト実装でこれを行う方法があります知っている - しかし、とてもきれいいないようです:

Calling protocol default implementation from regular method

+0

でそれを使用することができるようになりますなぜ14792238。 – kennytm

+0

それは必要です。 – etayluz

答えて

0

私はこれが働くことができますね、IMO完璧ではないものの、 :

protocol BorderColorView { 
    var borderColor: UIColor! { get set } 
} 

extension BorderColorView { 
    var borderColor: UIColor! { 
     get { 
      if let color = (self as? UIView)?.layer.borderColor { 
       return UIColor(CGColor: color) 
      } 
      return nil 
     } 
     set { 
      (self as? UIView)?.layer.borderColor = newValue.CGColor 
     } 
    } 
} 

//Example usage: 

class MyView: UIView, BorderColorView { } 

これの欠点は、あなたが唯一の他のクラスUIViewにこのプロトコルに準拠しますが、できないことです。

また、あなたはこれを行うことができます。

あなたが見
protocol BorderColorView { 
    var view: UIView { get } 
    var borderColor: UIColor! { get set } 
} 

extension BorderColorView { 
    var borderColor: UIColor! { 
     get { 
      if let color = (self as? UIView)?.layer.borderColor { 
       return UIColor(CGColor: color) 
      } 
      return nil 
     } 
     set { 
      (self as? UIView)?.layer.borderColor = newValue.CGColor 
     } 
    } 
} 

// Example usage: 

class MyView: UIView, BorderColorView { 
    var view: UIView { 
     return self 
    } 
} 

、これは少し重複したコードを作成します。あなたの質問にはそれほど多くはありませんが、それでもコードは重複しています。あなたが望むものを賢く選んでください。

+0

努力していただきありがとうございますが、あなたのコードはコンパイルされません。 – etayluz

+0

@etayluz本当ですか?私は遊び場で試しました!編集前のコードを使用しましたか?それは間違っていた。リビジョン番号2のコードを使用してください。 – Sweeper

+0

タイプ 'MyView'がプロトコル 'BorderColorView'に準拠していません。 XCodeの実行7.3.1 – etayluz

0

http://stackoverflow.com/questions/を参照してください、あなたはUIViewのための拡張を書いていない、あなたはこれらの3つの新しいクラスを作成する必要がない場合には、すべてのUI要素

+0

@IBDesignableは拡張機能では機能しないため、サブクラスでのみ機能します – etayluz

関連する問題