swift 一个值为的泛型是一个集合

mgdq6dx1  于 2023-04-04  发布在  Swift
关注(0)|答案(3)|浏览(100)

我希望能够创建一个泛型类型的类,并为泛型是Dictionary的用例做一个扩展。
例如:

public final class AtomicCollection<WrappedValue> {

}

我希望能够实现Dictionary/Array/Set的所有方法,例如func removeAll()
我试着用extension这样做:

extension AtomicCollection where WrappedValue == Dictionary {

}

问题是,我得到以下错误:
Reference to generic type 'Dictionary' requires arguments in <...>
这将导致这样一个事实,即我需要提到的类型,其中KeyValue是为DictionaryElement是为Array等。
我希望能够为ALL Dictionaries,Arrays and Sets创建通用约束。
你知道吗?

zbq4xfa0

zbq4xfa01#

关键是你不是在问字典。你的标题抓住了你的意图:所有集合。这就是你想要的:

extension AtomicCollection where WrappedValue: Collection {}

如果你需要能够调用removeAll(),协议是RangeReplaceableCollection(这也意味着Collection):

extension AtomicCollection where WrappedValue: RangeReplaceableCollection {}

你只需要选择(或创建)一个协议,它包含了你需要的这组算法的方法。这就是协议的全部意义:来定义一组算法可以操作的方法。
有很多与集合类相关的协议。你可以在Sequence and Collection Protocols中找到它们的概述。

9fkzdhlc

9fkzdhlc2#

目前,您可以通过为扩展中的每个函数指定通用条件来实现这一点,但不能为整个扩展本身指定通用条件:

extension AtomicCollection {
    func removeAll<T1, T2>() where WrappedValue == Dictionary<T1, T2> {
    }
}
oxalkeyp

oxalkeyp3#

这次讨论导致我创建了自己的协议来公开特定的功能,正如@rob-napier所提供的那样。
这导致了一个简单而幼稚的解决方案,基于GCD,在Swift中为每一种类型(包括集合)提供原子性。
你可以在这里查看!
https://gitlab.com/yanivhasbanidev/atomics
感谢大家对以上内容的支持!

相关问题