调用特定功能(如果存在),否则调用协议中的默认功能

时间:2019-07-17 17:25:59

标签: ios swift

我遇到以下情况:函数的协议版本,并且可能有一个实现该协议的特定结构。如果存在一个特定的名称,我想称该名称,否则称为默认名称。

如果类型是最具体的,则可以使用。但是,如果我在某个地方(例如遍历集合),只授予协议一致性,那么检查特定功能是否存在的最佳方法是什么?

在下面,我将检查该实例的通用实现。但这有点手动,因为我必须了解自己哪个结构(..Agents)实现了该功能。

有更好的方法吗?

import Cocoa

protocol Agent {
    func doSomething()
}
extension Agent {
    func doSomething() {
        if let specialAgent = self as? SpecialAgent {
            specialAgent.doSomething()
            return
        } // same for fooAgent, barAgent, ...
        print("extension implementation")
    }
}

struct SpecialAgent: Agent {
    func doSomething() {
        print("specific implementation")
    }
}

// this would be somewhere where we get all kinds of Agents and act on them
let agents: [Agent] = [SpecialAgent()]
for agent in agents {
    agent.doSomething()
}

0 个答案:

没有答案