2017-08-17 2 views
0

リンクリストを使用してハッシュテーブルを実装する途中です。 合計3つのクラスがあります。Swiftで固定サイズの配列を初期化するときにエラーが発生しました

class HashNode<Key: Hashable, Value> { 
     var key: Key 
     var value: Value 
     var next: HashNode? 

     init(key: Key, value: Value) { 
      self.key = key 
      self.value = value 
     } 
    } 

    class HashTableBucket<Key: Hashable, Value> { 
     typealias Node = HashNode<Key, Value> 
     var head: Node? 
     var tail: Node? 

     func addNode(newNode: Node) { 
      //code 
     } 

     func findNode(key: Key) -> Node?{ 
      //code 
     } 
} 

struct HashTable<Key: Hashable, Value> { 
    private typealias Bucket = HashTableBucket<Key, Value> 
    private var buckets: [Bucket] 

    private(set) public var count = 0 
    private(set) public var capacity = 0 

    init(capacity: Int) { 
     assert(capacity > 0) 
     buckets = Array<Bucket>(repeating: [], count: capacity) 
    } 

    //other code 
} 

私はハッシュテーブルインスタンスを初期化するときに、Iがゼロ値とバケット(又はHashTableBucket)の一種である固定サイズのアレイを作りたいです。私は本質的にしたいと思う[[], [], [], [], []]私は、buckets = Array<Bucket>(repeating: [], count: capacity)行にエラーが発生しています。エラーは、

Playground execution failed: error: HashTable.xcplaygroundpage:163:19: error: cannot invoke initializer for type 'Array<HashTableBucket<Key, Value>>' with an argument list of type '(repeating: [Any], count: Int)' 
     buckets = Array<Bucket>(repeating: [], count: capacity) 
       ^

HashTable.xcplaygroundpage:163:19: note: expected an argument list of type '(repeating: Element, count: Int)' 
     buckets = Array<Bucket>(repeating: [], count: capacity) 

ここで間違っていますか?

答えて

1

引数は、配列の要素タイプのインスタンスで、 です。

buckets = Array<Bucket>(repeating: Bucket(), count: capacity) 

Bucketの配列を作成する。これは、自動タイプの推論により、

buckets = Array(repeating: Bucket(), count: capacity) 
に簡略化することができます。

ただし、その間に気づいたようは(:) Bucketはクラスがあり、これはあなたが意図するものではありません同じオブジェクトインスタンスへの複数の参照を持つ配列を作成します。考えられる解決策は、

buckets = (0..<capacity).map { _ in Bucket() } 

(詳細はSwift: Creating an Array with a Default Value of distinct object instancesを参照)です。

+0

私は簡単な質問があります。バケットを初期化すると、配列内の5つのアイテムはすべて同じインスタンスを共有しますか? – user7418039

+0

@ user7418039:確かに、Bucketはクラスです(と私はそれについて考えていたはずです)。 - 可能な解決策については、https://stackoverflow.com/questions/32921425/swift-creating-an-array-with-a-default-value-of-distinct-object-instancesを参照してください。 –

関連する問題