2016-02-20 67 views
0

我有2次,雙方共享一些共同的特性:創建函數處理不同意見的泛型類型訪問屬性

class View1: UIView 
{ 
    @IBOutlet weak var button1: UIButton 
    @IBOutlet weak var button2: UIButton 
} 

class View2: UIView 
{ 
    @IBOutlet weak var button1: UIButton 
    @IBOutlet weak var button2: UIButton 
} 

class Utils { 
    func enableButtons<T>(view: T) { 
     if view is View1 { 
      let tempView = view as View1 
      tempView.button1.enabled = true 
      tempView.button2.enabled = true 

     } else if view is View2 { 
      let tempView = view as View2 
      tempView.button1.enabled = true 
      tempView.button2.enabled = true 
     } 
    } 
} 

我如何在泛型函數enableButtons擺脫if-else語句,使其看起來像下面和發送作爲參數,這兩種觀點的作品:

class Utils { 
    func enableButtons<T>(view: T) { 
     view.button1.enabled = true 
     view.button2.enabled = true 
    } 
} 

回答

1

T需要被約束,使得編譯器知道該參數view有兩個屬性button1button2

爲了做到這一點,你需要使用的協議。您可以使用該協議來顯示兩個視圖之間的關係。因此,通用T可以知道關於兩個按鈕:

protocol TwoButtonView { 

    weak var button1: UIButton! { get set } 
    weak var button2: UIButton! { get set } 

} 

然後,已每個視圖符合協議:

class View1: UIView, TwoButtonView 


class View2: UIView, TwoButtonView 

然後,重寫enableButtons以便T只能符合TwoButtonView協議:

func enableButtons<T: TwoButtonView>(view: T) { 
    view.button1.enabled = true 
    view.button2.enabled = true 
} 

編輯

@DavidBerry指出,你沒有,如果你走這條路線使用泛型。相反,你可以這樣做:

func enableButtons(view: TwoButtonView) { 
    view.button1.enabled = true 
    view.button2.enabled = true 
} 
+0

差不多了,注意,實在沒有理由在這種情況下,通用,只需使用:'FUNC enableButtons(查看:TwoButtonView){...}' –

+0

@DavidBerry是,但OP想要泛型,所以我給了他泛型。泛型是有用的,但有時它們過於複雜。 – tktsubota

+0

我認爲他只是想要仿製藥,因爲這就是他最初的方式,但也許:) –