swift - 如何在 Swift 中多重绑定(bind)协议(protocol)实现?

标签 swift dependency-injection

假设我有一个假设的猫市场。这些猫由许多猫经销商提供,包括 SPCA、猫反斗城和动物收容所。我想提供一个通用接口(interface),CatProvider 可以通过该接口(interface)显示他们的猫。我还希望允许 CatProvider 协议(protocol)的实现者能够注册以提供猫,而我的应用程序不知道它们的存在。例如:

protocol Cat {
  let name: String { get }
  let price: Float { get }
}

protocol CatProvider {
  func getCats() -> [Cat]
}

class CatService {
  func allCats() -> Set<Cat> {
    let catProviders: [CatProvider] = // Get all of the cat providers.
    return catProviders.reduce(Set<Cat>()) {
      cats, provider in
      return cats.union(Set(provider.getCats()))
    }
  }
}

我正在尝试确定允许我的 CatProvider 在 CatService 不知情的情况下将自己多重绑定(bind)到 CatProvider 协议(protocol)的最佳方法。 IE。我不希望 CatService 实例化 CatProvider。在 Swift 中可以做到这一点吗?在 Objective-C 中,我会在每个文件的顶部都有一个绑定(bind)宏,但我不确定如何在这里实现相同的结果。

最佳答案

让我们首先添加一个 NSHashTable 来保留对任何注册自身的提供程序的弱引用。

class CatService {
    private let providers = NSHashTable.weakObjectsHashTable()

    // stuff
}

现在,让我们提供一种添加(如果您愿意,还可以删除)提供者的方法:

class CatService {
    private let providers = NSHashTable.weakObjectsHashTable()

    func addProvider(provider: CatProvider) {
        providers.addObject(provider)
    }

    // optional:
    func removeProvider(provider: CatProvider) {
        providers.removeObject(provider)
    }
}

我们可以返回所有提供者的数组或集合。

作为数组:

var allProviders: [CatProvider]? {
    return providers.allObjects as? [CatProvider]
}

作为一套:

var allProviders: Set<CatProvider>? {
    return providers.setRepresentation as? Set<CatProvider>
}

当然,我们可以使用 providers.allObjectsproviders.setRepresentation 来快速枚举我们实际使用此 CatService 的任何内容的提供程序 类,如果需要的话。

关于swift - 如何在 Swift 中多重绑定(bind)协议(protocol)实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31507741/

相关文章:

swift - 查找从 3d 空间中的另一个点投影的直线上的点的 3d 坐标

ios - Swift:当截断(环绕)屏幕并转到新行时,将长字符串拆分为较小的字符串

c# - Ninject - 类库项目中静态类中的内核

swift - 为什么可选常量不会自动具有默认值 nil

ios - Swift - 如何获取嵌入在 UITableView 单元格中的选定控件段?

iphone - 如何在 UITableView 之上添加一个 UIImage

c# - 依赖注入(inject)接线问题

c# - 通过依赖注入(inject)执行我的类函数

c# - 使用依赖注入(inject)进行内部操作的类库的最佳实践是什么?

c++:没有全局变量或单例或将其传递给每个方法的记录器类