structやenumなどの値の型は、値によってコピーされます。値型の変数の参照を取得することは可能ですか?Swiftで値型の参照を取得する方法は?
struct Test {}
let t = Test()
let s = t // How to get a reference to t instead of a copy of t?
structやenumなどの値の型は、値によってコピーされます。値型の変数の参照を取得することは可能ですか?Swiftで値型の参照を取得する方法は?
struct Test {}
let t = Test()
let s = t // How to get a reference to t instead of a copy of t?
参照を取得する方法はいくつかあります。 KristopherのBox
ソリューションは、最も柔軟性の高いソリューションの1つで、構造体をObjCに渡すなどの問題を処理するカスタムボックスとして構築できます。
さらに、最も明白なのは、inout
パラメータを渡すことです。これは参照とまったく同じものではありませんが、その動作は非常に似ている可能性があり、高性能コードの一部となることは間違いありません。
スタックを下に移動すると、一般タイプではwithUnsafePointer(to:)
、アレイタイプでは.withUnsafeBufferPointer
を使用して、UnsafePointer
とその友人が表示されます。
しかし、プロパティに保存できる永続参照型が必要な場合は、Kristopherが説明するようにBox
が必要です。
(ちょうど私がそれを覚えていなかったので、将来の読者のためにそれをキャプチャしますが、MartinRコメントでそれを指摘するために:。as AnyObject
は自動的に値型をボックスすることができます)
ありがとう!クリストファーの答えとあなたをアップアップしました。これを完全性のための答えとして選択する。 – Boon
典型的な解決策は、値型をラップする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/を参照してください。
ありがとう、素晴らしい情報! – Boon
は、なぜあなたは、参照が必要なのでしょうか?ユースケースは何ですか? – user28434
非常に奇妙な質問です。値の型は値渡しの型です。参照が必要な場合は、参照型を使用します。 – Sulthan
@ user28434言語間の移植やパフォーマンスのために使用できます。たとえば、tupleはSwiftでは値の型ですが、C#では参照型です。 – Boon