2017-02-09 15 views
1

structやenumなどの値の型は、値によってコピーされます。値型の変数の参照を取得することは可能ですか?Swiftで値型の参照を取得する方法は?

struct Test {} 

let t = Test() 
let s = t // How to get a reference to t instead of a copy of t? 
+3

は、なぜあなたは、参照が必要なのでしょうか?ユースケースは何ですか? – user28434

+2

非常に奇妙な質問です。値の型は値渡しの型です。参照が必要な場合は、参照型を使用します。 – Sulthan

+0

@ user28434言語間の移植やパフォーマンスのために使用できます。たとえば、tupleはSwiftでは値の型ですが、C#では参照型です。 – Boon

答えて

4

参照を取得する方法はいくつかあります。 KristopherのBoxソリューションは、最も柔軟性の高いソリューションの1つで、構造体をObjCに渡すなどの問題を処理するカスタムボックスとして構築できます。

さらに、最も明白なのは、inoutパラメータを渡すことです。これは参照とまったく同じものではありませんが、その動作は非常に似ている可能性があり、高性能コードの一部となることは間違いありません。

スタックを下に移動すると、一般タイプではwithUnsafePointer(to:)、アレイタイプでは.withUnsafeBufferPointerを使用して、UnsafePointerとその友人が表示されます。

しかし、プロパティに保存できる永続参照型が必要な場合は、Kristopherが説明するようにBoxが必要です。

(ちょうど私がそれを覚えていなかったので、将来の読者のためにそれをキャプチャしますが、MartinRコメントでそれを指摘するために:。as AnyObjectは自動的に値型をボックスすることができます)

+0

ありがとう!クリストファーの答えとあなたをアップアップしました。これを完全性のための答えとして選択する。 – Boon

3

典型的な解決策は、値型をラップするBox<T>参照タイプを使用することです。たとえば:

final class Box<T> { 
    let value: T 

    init(_ value: T) { 
     self.value = value 
    } 
} 

let t = Test() 
let boxed = Box(t) 
let anotherReference = boxed 
let theValue = anotherReference.value 

は、詳細はhttps://www.natashatherobot.com/swift-generics-box/を参照してください。

+0

ありがとう、素晴らしい情報! – Boon

関連する問題