2017-12-18 320 views
0

在夫特套,有一個方法來構造一個類型的「集的給定尺寸的?」(儘管在夫特沒有依賴性類型的,是這樣的結構仍然可能沒有過多的「扭曲?」)給定尺寸爲夫特型

作爲一個例子,我希望能夠定義一個參數化類型SetOfSizeTwo<T>,它的實例是由(Hashable)類型T正好兩個對象組成的集合。

目前,我使用的是窮人的代理:

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

然而,這種類型不會強制屬性set到是2

大小的更新

的博客文章A hack for fixed-size arrays in Swift,由Ole Begemann引導,我相信如果可能的話,在Swift 4中構建一個固定大小的類型是非常重要的。

+3

我認爲最好的方法是創建一個包裝類自定義添加和刪除方法。並且讓底層的數據結構保密,這樣沒有人可以修補它。 – Michal

+0

@Michal謝謝你的實際建議。基本上,我想強制設置大小作爲編譯時間約束,理想情況下使用類型。但是我懷疑如果沒有依賴類型的語言支持,這是不可能的。 – egnha

回答

1

下面是一種方法,儘可能接近我的需求,以滿足您的需求。這是周圍的邊緣有點粗糙,需要一些拋光,但我想你會明白我的意思:

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]