如何通过引用传递结构?

时间:2014-10-18 06:26:11

标签: swift struct pass-by-reference

如果我有一些现有的结构,但我想使用"参考"行为,我该如何实现?

我可以写一些像

这样的简单类持有者
class Box<T> {
    var value: T
    init(_ value: T) {
        self.value = value
    }
}

我想标准库中必须有现成的课程,但我找不到它。

我想在我的班级中存储该引用,因此inout参数不是我需要的。

2 个答案:

答案 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}}从字面意义上来说是不安全