值和類型,如結構和枚舉按值複製。是否有可能獲得值類型變量的引用?如何在Swift中獲取值類型的引用?
struct Test {}
let t = Test()
let s = t // How to get a reference to t instead of a copy of t?
值和類型,如結構和枚舉按值複製。是否有可能獲得值類型變量的引用?如何在Swift中獲取值類型的引用?
struct Test {}
let t = Test()
let s = t // How to get a reference to t instead of a copy of t?
有幾種方法可以獲得參考。 Kristopher的Box
解決方案是最靈活的解決方案之一,可以構建爲自定義框來處理將結構傳遞給ObjC等問題。
除此之外,最明顯的是通過inout
參數。這與引用不完全相同,但其行爲可能非常相似,並且絕對可以是高性能代碼的一部分。
然後向下移動堆棧,其中有UnsafePointer
及其朋友,在常規類型上使用withUnsafePointer(to:)
,或在數組類型上使用.withUnsafeBufferPointer
。
但是,如果您需要可以存儲在屬性中的持久引用類型,則需要按照Kristopher描述的Box
。
(只是捕捉到它未來的讀者,因爲我還沒有記住它,但MartinR指出了這一點,在註釋:as AnyObject
可以自動框的值類型)
謝謝! Upvoted克里斯托弗的答案和你的。選擇這個作爲完整性的答案。 – 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它可以用於在語言或性能之間進行移植。例如,元組是Swift中的值類型,但在C#中是引用類型。 – Boon