Ios 如果存在特定函数,则调用该函数,否则将使用协议中的默认值

Ios 如果存在特定函数,则调用该函数,否则将使用协议中的默认值,ios,swift,Ios,Swift,我有以下情况:函数有一个协议版本,可能有一个实现该协议的特定结构。如果存在一个特定的,我想将其称为,否则称为默认值 如果类型是最具体的,则此选项有效。但是,如果我在某个地方(比如在集合上迭代),只授予协议一致性,那么检查特定函数是否存在的最佳方法是什么 在下面,我将检查泛型实现中的实例是否更特殊。但这有点像手工操作,因为我必须知道哪些结构(…代理)实现了这个功能 有更好的方法吗 import Cocoa protocol Agent { func doSomething() } ext

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

如果类型是最具体的,则此选项有效。但是,如果我在某个地方(比如在集合上迭代),只授予协议一致性,那么检查特定函数是否存在的最佳方法是什么

在下面,我将检查泛型实现中的实例是否更特殊。但这有点像手工操作,因为我必须知道哪些结构(…代理)实现了这个功能

有更好的方法吗

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()
}

为什么doSomething()不是协议的一部分,这样符合代理的每个结构都有自己的实现呢?看来你现在想做什么了谢谢,我在转会中错过了,这里有什么问题?只要您将函数声明为协议要求(如您在edit中添加的那样),您的代码就应该已经完成了您希望它做的事情。为什么doSomething()不是协议的一部分,以便符合代理的每个结构都有自己的实现呢?看来你现在想做什么了谢谢,我在转会中错过了,这里有什么问题?只要将函数声明为协议要求(如您在编辑中添加的),您的代码就应该已经执行了您希望它执行的操作