2016-08-23 40 views
1

繼承我有三個雨燕類:斯威夫特:分享方法和計算性能的跨類不彼此

@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 
    } 
    } 

} 

這三類具有相同的計算性能(BORDERCOLOR)。 我想幹(不要重複自己),並有這樣重複計算的屬性或從某處繼承的方法。有沒有辦法做到這一點?

我知道有一種方法與協議擴展和協議方法的默認實現做到這一點 - 但它似乎不那麼幹淨:

Calling protocol default implementation from regular method

+0

如果創建這些3個新類是沒有必要的,看到http://stackoverflow.com/questions/ 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

你爲什麼不寫的UIView的延伸,你將能夠在每一個UI元素使用它

+0

因爲@IBDesignable不適用於擴展 - 僅適用於子類 – etayluz