如何通过引用传递结构?
问题描述:
如果我有一些现有的结构,但我想使用“参考”行为,我该如何实现?如何通过引用传递结构?
我可以写一些简单的类持有人一样
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