2017-02-09 47 views
1

值和類型,如結構和枚舉按值複製。是否有可能獲得值類型變量的引用?如何在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它可以用於在語言或性能之間進行移植。例如,元組是Swift中的值類型,但在C#中是引用類型。 – Boon

回答

4

有幾種方法可以獲得參考。 Kristopher的Box解決方案是最靈活的解決方案之一,可以構建爲自定義框來處理將結構傳遞給ObjC等問題。

除此之外,最明顯的是通過inout參數。這與引用不完全相同,但其行爲可能非常相似,並且絕對可以是高性能代碼的一部分。

然後向下移動堆棧,其中有UnsafePointer及其朋友,在常規類型上使用withUnsafePointer(to:),或在數組類型上使用.withUnsafeBufferPointer

但是,如果您需要可以存儲在屬性中的持久引用類型,則需要按照Kristopher描述的Box

(只是捕捉到它未來的讀者,因爲我還沒有記住它,但MartinR指出了這一點,在註釋:as AnyObject可以自動框的值類型)

+0

謝謝! Upvoted克里斯托弗的答案和你的。選擇這個作爲完整性的答案。 – 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

相關問題