2017-12-18 11 views
0

Swiftでは、タイプ「」を「所定のサイズのセット」に構成する方法があります(スウィフトに従属タイプがないにもかかわらず、それでも可能です例:の例では、ちょうど2つのオブジェクト(Hashable)のタイプがTのセットであるパラメータ化タイプSetOfSizeTwo<T>を定義することができます。Swiftタイプの指定サイズのセット

現在、私は貧乏人のプロキシを使用しています

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

しかし、このタイプは2

のサイズであるプロパティsetを強制するものではありませんアップデート

Ole Begemannのブログ記事A hack for fixed-size arrays in 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] 
関連する問題