如何通过引用传递结构?

vbe*_*nar 11 struct pass-by-reference swift

如果我有一些现有的struct,但我想使用"Reference"行为,我该如何实现呢?

我可以写一些简单的类持有者

class Box<T> {
    var value: T
    init(_ value: T) {
        self.value = value
    }
}
Run Code Online (Sandbox Code Playgroud)

我想标准库中必须有现成的类,但我没有找到它.

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

vbe*_*nar 7

对我来说,最好的变种是使用持有者:

class Ref<T> {
  var value: T

  init(_ value: T) {
    self.value = value
  }
}
Run Code Online (Sandbox Code Playgroud)


rin*_*aro 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
Run Code Online (Sandbox Code Playgroud)

因为,通常struct是从"堆栈"内存中分配的,当你这样做时:

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

let rect = makeRect()
Run Code Online (Sandbox Code Playgroud)

rect.sizeRef不再指向有效记忆.从字面意义上讲UnsafeMutablePointer不安全的.