我认为我以一种不应该工作的方式使用协议......但确实如此。有人可以告诉我,我做的事情是否合适?
示例
让我们说我的应用程序有三个视图控制器:MainView,SecondaryView,EditorView。 EditorView具有应在其他视图中运行代码的按钮。我有一个协议,允许我远程触发功能。
这是奇怪的事情,我做的事情可能是我不应该......但它正在发挥作用:MainView和SecondaryView都遵循相同的协议。我不明白它为什么会起作用,但确实如此。
当我在MainView中并加载EditorView时,例如,单击"添加",MainView中的代码运行并运行。
当我在SecondaryView中并加载EditorView并单击"添加"时,SecondaryView中的代码将运行并运行。
问题
如果可以的话,如何确定委托给哪个(主要与次要)?如果不行,为什么会有效?
答案 0 :(得分:2)
这不仅没关系 - 它很棒。您已经发现了协议的主要优点之一。
在EditorView
中,您有一个delegate
属性(您可能已将其命名为其他内容):
weak var delegate : EditorProtocol?
您在MainView
和SecondaryView
的某个地方也有一些代码如下:
let editor = EditorView() // or perhaps you get it in prepareForSegue(_:sender:)
editor.delegate = self
告诉EditorView
与哪个对象进行通信。
然后在EditorView
内拨打代码:
delegate?.doSomething()
如果MainView
创建了此编辑器,则delegate
为MainView
。否则,它是SecondaryView
。
当您将delegate
(或您命名的任何内容)设置为特定对象时,EditorView
将与之通信。