gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:13:15 26 4
gpt4 key购买 nike

假设我有一个假设的猫市场。这些猫由许多猫经销商提供,包括 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com