2016-08-17 6 views
1

私は現在、いくつかの参照を探しています、外のリンゴの迅速なプログラミングセットタイプのメモリ空間の基準とし、以下の擬似コードを考えると基本的な操作(和、積、排他、減算など)スウィフト:基本操作のコピーまたはポインタの結果が<Object>に設定されていますか?

結果:

var entities = Set<GKEntity>() 
var subSetA = Set<GKEntity>() 
var subSetB = Set<GKEntity>() 

各サブセットはGKEntityのサブクラスを持ち、私のアプリケーションでは私が使用するいくつかのルーチンで呼び出されます。

これらのサブセットの和集合を使用すると、すべてのサブセットのスーパーセットまたはすべてのサブセットの和集合として設定されます。

これは、スーパーセットがサブセット内の要素のコピーであること、またはポインタのみであることを意味しますか?

これは、操作で新しいメモリアドレスをコピーまたは割り当てする必要があるかのように、私は記憶領域の使用方法を尋ねるので、私は要素を格納する別の戦略を使用する必要があります。

純粋に構造的な観点からは、これらはメモリアドレスへのポインタとなることを意味する「浅い」コピーであると仮定しますが、すべてのサブセットの結合としてスーパーセットを作成したら、スーパーセットに反映されるか、またはスーパーセット上で操作が行われる場合には特定のサブセット上に表示される。

・ホープ、この質問が有効

答えて

0

ノートで、私はあなたがthisGKEntityを意味すると仮定しています。

GKEntityはクラスなので、作成したセットには実際のGKEntityオブジェクトへの参照(ポインタ)が格納されます。したがって、サブセット内のオブジェクトの変更はすべてスーパーセットに反映されます。ここで

がこれを証明する短いコードです:あなたが見ることができるように

class A: IntegerLiteralConvertible, Hashable, CustomStringConvertible { 
    var x: Int 

    required init(integerLiteral value: Int) { 
     self.x = value 
    } 

    var hashValue: Int { 
     return x 
    } 

    var description: String { 
     return String(x) 
    } 
} 

func ==(lhs: A, rhs: A) -> Bool { 
    return lhs.hashValue == rhs.hashValue 
} 

let setA: Set<A> = [1, 2, 3, 4] 
let setB: Set<A> = [5, 6, 7, 8] 
print(setA) // [2, 3, 1, 4] 
print(setB) // [5, 6, 7, 8] 
let union = setA.union(setB) 
print(union) // [2, 4, 5, 6, 7, 3, 1, 8] 
setA.first!.x = 30 
print(union) // [30, 4, 5, 6, 7, 3, 1, 8] 

、私はsetAの最初の項目に(30に2からxを変更)変更を行いました。その後、私はunionを印刷しましたが、その中に30を含んでいました。

+0

ok、concise。あなたが投稿したリンクのGKEntityクラスの適合性にHashableは含まれていませんが、それはxcodeのドキュメントにあります。これは両方向に進むということですか?スーパーセット操作はサブセットに反映されますか?それは人生をもっと難しくしないでしょうが、理解を完了するように求めるだけです。 – triple7

+0

セットは 'GKEntity'sの参照を格納するので、両方向に行きます。私が与えたコードを自分で試してみませんか?それは楽しみになるだろう! @ triple7 – Sweeper

+0

おそらく(将来のこの読者の読者のために)セットは順序付けられていないコレクションであると言えるでしょう。なぜなら、 '' setA' _の最初のアイテムは '2 'になります(混乱するかもしれませんそれはセットの定義のセットに追加された2番目のアイテムです)。 – dfri

関連する問題