一尘不染

检查类是否符合协议

swift

我正在尝试为我们的应用程序快速制作一个简单的依赖注入系统,为期2天。我对任何解决方案都比较灵活,但是我想要一些东西,所以我可以说“给我一个符合该协议的实例”,返回的实际类型可以是只要符合所述协议的任何类型。我已经尝试了很多方法,包括泛型,但是设法弄清了它是否真的可以工作,所以现在我只涉及基本知识,例如:

protocol AProtocol {

}

class AClass: AProtocol {

}

class MyDiThing {
    public static func objectConformingTo(aProtocol: Any) -> Any? {
        // And here I want to do something like
        if AClass is aProtocol {
            return AClass()
        }
        return nil
    }
}

// The calling code ..
let aObject = MyDIThing.objectConformingTo(AProtocol)

我知道它并不漂亮,但是现在,我对性能/错误代码并不挑剔,只要它能解决解耦问题(最好可以包含在MyDIThing类中)即可。如果这是不可能的,那么我欢迎其他解决方案。我已经在Objective-
c中使用了类似的解决方案,并获得了很好的成功,只是拥有一个字典,其键为NSStringFromProtocol,值为类,用入站协议对字典进行下标并实例化该类。超级简单。很快感觉不到!


阅读 235

收藏
2020-07-07

共1个答案

一尘不染

如果导入obj-c,则可以执行以前的操作。

否则,很难,因为协议并不以相同的方式存在。考虑您工厂的基于注册的系统。您的每个类都将通过提供一个函数或闭包来注册自己,该函数或闭包可被调用以返回该类的新实例,并且注册是针对字符串或某种其他类型的标识符的。这是拥有协议类型的好地方,但是在obj-
c中,您实际上是在使用字符串转换来做同样的事情。您可以针对任何Equatable保持通用性的东西进行注册。

2020-07-07