我遇到以下情况:函数的协议版本,并且可能有一个实现该协议的特定结构。如果存在一个特定的名称,我想称该名称,否则称为默认名称。
如果类型是最具体的,则可以使用。但是,如果我在某个地方(例如遍历集合),只授予协议一致性,那么检查特定功能是否存在的最佳方法是什么?
在下面,我将检查该实例的通用实现。但这有点手动,因为我必须了解自己哪个结构(..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()
}