如果我有一些現有的結構,但我想使用「參考」行爲,我該如何實現?如何通過引用傳遞結構?
我可以寫一些簡單的類持有人一樣
class Box<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
我想一定是在標準庫準備好類,但我沒有找到它。
我想將該引用存儲在我的類中,所以inout參數不是我所需要的。
如果我有一些現有的結構,但我想使用「參考」行爲,我該如何實現?如何通過引用傳遞結構?
我可以寫一些簡單的類持有人一樣
class Box<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
我想一定是在標準庫準備好類,但我沒有找到它。
我想將該引用存儲在我的類中,所以inout參數不是我所需要的。
對我來說最好的變種使用類持有人:
class Ref<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
你可以,但你不應該把它存儲在你的課堂上。
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
是不安全在字面意義上。
會了'class'更適合你的目的是什麼?他們通過引用傳遞。 'struct'的實例被設計爲按值傳遞。 – sapi 2014-10-18 06:27:25
這將解決我的問題,但這意味着我必須複製CGRect等現有框架結構並實現來回轉換。如果可能,我想避免重複。 – vbezhenar 2014-10-18 06:34:49
@sapi:Swift中的所有東西總是按值傳遞,除非參數被標記爲'inout',在這種情況下,它總是被引用傳遞。 – newacct 2014-10-19 03:58:18