给定大小的集合作为Swift类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定大小的集合作为Swift类型相关的知识,希望对你有一定的参考价值。

在Swift中,有没有办法构造一种“给定大小的集合?”(尽管在Swift中没有依赖类型,但这种结构是否可能没有过多的“扭曲”?)

作为一个例子,我希望能够定义一个参数化类型SetOfSizeTwo<T>,其实例是包含恰好两个(Hashable)类型T的对象的集合。

目前,我正在使用穷人的代理人:

struct SetOfSizeTwo<T> where T: Hashable {
    var set = Set<T>(minimumCapacity: 2)
}

但是,此类型不会强制属性set的大小为2。

更新

Ole Begemann撰写的博客文章A hack for fixed-size arrays in Swift让我相信,如果可能的话,Swift 4中固定大小的类型的强大构造是非常重要的。

答案

这是一种尽可能接近我的方法,以满足您的需求。边缘有点粗糙,需要一些抛光,但我想你会明白这个想法:

class Size {
    let size: Int

    init(size: Int) {
        self.size = size
    }

    required init() {
        self.size = 0
    }
}

class SizeOne: Size {
    private override init(size: Int) {
        super.init(size: size)
    }

    required init() {
        super.init(size: 1)
    }
}

class SizedSet<S, T> where S: Size, T: Hashable {
    private var set: Set<T>
    private let maximumSize: S

    init() {
        set = Set<T>()
        maximumSize = S()
    }

    func insert(item: T) {
        if !set.contains(item) && set.count + 1 <= maximumSize.size {
            set.insert(item)
        }
    }

    func remove(item: T) {
        set.remove(item)
    }

    func contents() -> Set<T> {
        return set
    }
}

用法:

let set: SizedSet<SizeOne, Int> = SizedSet()
print(set.contents())
// []

set.insert(item: 1)
print(set.contents())
// [1]

set.insert(item: 2)
print(set.contents())
// [1]

以上是关于给定大小的集合作为Swift类型的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用协议作为类型时出错

Swift学习笔记:集合类型

Swift:集合视图未正确调整以更改大小

13 个非常有用的 Python 代码片段

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

Swift:任何类型的序列作为函数参数