新手
swift,我试图创建一个服务注册表:
class ServiceRegistry { static var instance = ServiceRegistry() private var registry = [String:AnyObject]() private init(){} func register<T>(key:T,value:AnyObject) { self.registry["\(T.self)"] = value } func get<T>(_:T) -> AnyObject? { return registry["\(T.self)"] } }
但不是超级友好的:
寄存器:
ServiceRegistry.instance.register(CacheServiceProtocol.self,value:ImageCacheService())
检索:
if let cache = ServiceRegistry.instance.get(CacheServiceProtocol) as? CacheServiceProtocol { ... }
有更好的方法吗?摆脱as会有用吗? if中的CacheServiceProtocol …
解决方法
Swinject是Swift的依赖注入框架.在你的情况下,你可以使用它而不使用强制转换为?
寄存器:
let container = Container() container.register(CacheServiceProtocol.self) { _ in ImageCacheService() }
检索:
let cache = container.resolve(CacheServiceProtocol.self)!
这里缓存被推断为CacheServiceProtocol类型.如果未注册指定的类型,则resolve方法返回nil.我们知道CacheServiceProtocol已经注册,所以强行解包!用来.
UPDATE
我没有完全回答这个问题.删除强制转换的实现是存储工厂闭包而不是注册表中的值.这是一个例子.我还修改了键的类型.
class ServiceRegistry { static var instance = ServiceRegistry() private var registry = [String:Any]() private init(){} func register<T>(key:T.Type,factory: () -> T) { self.registry["\(T.self)"] = factory } func get<T>(_:T.Type) -> T? { let factory = registry["\(T.self)"] as? () -> T return factory.map { $0() } } }
寄存器:
ServiceRegistry.instance.register(CacheServiceProtocol.self) { return ImageCacheService() }
检索:
// The type of cache is CacheServiceProtocol? without a cast. let cache = ServiceRegistry.instance.get(CacheServiceProtocol.self)
使用@autoclosure可能也不错.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。