问题 如何通过引用传递结构?


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

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

class Box<T> {
    var value: T
    init(_ value: T) {
        self.value = value
    }
}

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

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


5836
2017-10-18 06:26


起源

会的吗? class 更适合您的目的?他们通过引用传递。实例 struct 旨在通过价值传递。 - sapi
这将解决我的问题,但这意味着我必须复制现有的框架结构,如CGRect并来回实现转换。如果可能的话,我想避免重复。 - vbezhenar
@sapi:除非参数被标记,否则Swift中的所有内容总是按值传递 inout 在这种情况下,它总是通过引用传递。 - newacct
@newacct基本上, inout 参数不是“按引用调用”,而是 “调用 - 复制 - 恢复”。 - rintaro


答案:


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

class Ref<T> {
  var value: T

  init(_ value: T) {
    self.value = value
  }
}

7
2017-11-06 13:57





你可以,但你不应该把它存放在你的班级。

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 是 不安全 从字面意义上说。


6
2017-10-18 09:29