Как передать структуру по ссылке?

Если у меня есть какая-то существующая структура, но я хочу использовать поведение "Ссылка", как мне это достичь?

Я могу написать некоторый простой класс-держатель, например

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

Я предполагаю, что в стандартной библиотеке должен быть готовый класс, но я его не нашел.

Я хочу сохранить эту ссылку в своем классе, поэтому параметр inout не то, что мне нужно.

Ответ 1

Для меня лучшим вариантом пользовался класс-держатель:

class Ref<T> {
  var value: T

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

Ответ 2

Вы можете, но вы не должны хранить его в своем классе.

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 небезопасно в буквальном смысле.