我正在尝试为我们的应用程序快速制作一个简单的依赖注入系统,为期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,值为类,用入站协议对字典进行下标并实例化该类。超级简单。很快感觉不到!
如果导入obj-c,则可以执行以前的操作。
否则,很难,因为协议并不以相同的方式存在。考虑您工厂的基于注册的系统。您的每个类都将通过提供一个函数或闭包来注册自己,该函数或闭包可被调用以返回该类的新实例,并且注册是针对字符串或某种其他类型的标识符的。这是拥有协议类型的好地方,但是在obj- c中,您实际上是在使用字符串转换来做同样的事情。您可以针对任何Equatable保持通用性的东西进行注册。
Equatable