2014-10-18 249 views
11

如果我有一些現有的結構,但我想使用「參考」行爲,我該如何實現?如何通過引用傳遞結構?

我可以寫一些簡單的類持有人一樣

class Box<T> { 
    var value: T 
    init(_ value: T) { 
     self.value = value 
    } 
} 

我想一定是在標準庫準備好類,但我沒有找到它。

我想將該引用存儲在我的類中,所以inout參數不是我所需要的。

+0

會了'class'更適合你的目的是什麼?他們通過引用傳遞。 'struct'的實例被設計爲按值傳遞。 – sapi 2014-10-18 06:27:25

+0

這將解決我的問題,但這意味着我必須複製CGRect等現有框架結構並實現來回轉換。如果可能,我想避免重複。 – vbezhenar 2014-10-18 06:34:49

+0

@sapi:Swift中的所有東西總是按值傳遞,除非參數被標記爲'inout',在這種情況下,它總是被引用傳遞。 – newacct 2014-10-19 03:58:18

回答

7

對我來說最好的變種使用類持有人:

class Ref<T> { 
    var value: T 

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

你可以,但你不應該把它存儲在你的課堂上。

struct Size { 
    var width:Float 
    var height:Float 
} 

class Rect { 
    var sizeRef:UnsafeMutablePointer<Size> 
    init(_ size:UnsafeMutablePointer<Size>) { 
     self.sizeRef = size 
    } 
    func doubleSize() { 
     self.sizeRef.memory.height *= 2.0 
     self.sizeRef.memory.width *= 2.0 
    } 
} 

var size = Size(width: 20.0, height: 20.0) 
let rect = Rect(&size) 
rect.doubleSize() 
println("size: \(size.width) x \(size.height)") // -> size: 40.0 x 40.0 

因爲,通常情況下,struct從 「堆棧」 內存,當你做這樣的分配:

func makeRect() -> Rect { 
    var size = Size(width: 20.0, height: 20.0) 
    return Rect(&size) 
} 

let rect = makeRect() 

rect.sizeRef不再指向有效的內存。 UnsafeMutablePointer不安全在字面意義上。