如果我有一些现有的结构,但我想使用"参考"行为,我该如何实现?
我可以写一些像
这样的简单类持有者class Box<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
我想标准库中必须有现成的课程,但我找不到它。
我想在我的班级中存储该引用,因此inout参数不是我需要的。
答案 0 :(得分:7)
对我来说,最好的变体是使用持有者:
class Ref<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
答案 1 :(得分: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
不再指向有效内存。 <{1}}从字面意义上来说是不安全。