2017-07-05 50 views
-1

我學習Swift和我瞭解協議(Swift)類似於接口(Java),但我不知道如何使用協議如接口(偵聽器) 現在如何在Swift中使用它?如何在Java中使用類似偵聽器的方法使用協議

+0

參考https://stackoverflow.com/questions/27371194/set-action-listener-programmatically-in-swift – Akshay

+0

在大多數情況下,你不會的。你只需要使用閉包。 (爪哇的lambda的是這些更受限制的版本) – Alexander

+0

[希望這會幫助你](https://www.youtube.com/watch?v=DBWu6TnhLeY) – Sandu

回答

0

你需要知道在iOS中沒有動作偵聽器這樣的事情。我們稱他們爲「代表」。

例如,您創建了一個名爲MyView的視圖,並且用戶可以通過與視圖交互來觸發三個不同的事件。

您想讓控制器知道這些事件何時發生。所以你創建一個MyViewDelegate。這與MyViewActionListener類似。

protocol MyViewDelegate { 
    func event1Occurred() 
    func event2Occurred() 
    func event3Occurred() 
} 

在你MyView類中,添加一個名爲屬性delegate

weak var delegate: MyViewDelegate? 

要設置的myView動作監聽,這是您在MyViewController創建的MyView一個實例,首先符合MyViewControllerMyViewDelegate

class MyViewController: UIViewController, MyViewDelegate { 

} 

然後,impleme NT中的方法:

func event1Occurred() {} 
func event2Occurred() {} 
func event3Occurred() {} 

這類似於Java創建一個匿名類:

MyViewActionListener listener = new MyViewActionListener() { 
    public void onEvent1() {} 
    public void onEvent2() {} 
    public void onEvent3() {} 
}; 

,然後分配selfmyView.delegate

myView.delegate = self 

這就像調用setActionListener在Java中:

myView.setActionListener(listener); 
然而

if (actionListener != null) { 
    actionListener.onEvent1(); 
} 

,有替代方式迅速做到這一點,比如閉包:

在合適的時間MyView可以調用這些委託方法:

delegate?.event1Occurred() 

這是怎樣的。閉包類似於Java的lambda表達式,它們本質上只是一個方法的接口。

另一種選擇是使用目標選擇器模式。這在Objective-C API中廣泛使用,如UIButton

myButton.addTarget(self, selector: #selector(someFunc), for: .touchUpInside) 
相關問題