Ответ 1
Для меня лучшим вариантом пользовался класс-держатель:
class Ref<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
Если у меня есть какая-то существующая структура, но я хочу использовать поведение "Ссылка", как мне это достичь?
Я могу написать некоторый простой класс-держатель, например
class Box<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
Я предполагаю, что в стандартной библиотеке должен быть готовый класс, но я его не нашел.
Я хочу сохранить эту ссылку в своем классе, поэтому параметр inout не то, что мне нужно.
Для меня лучшим вариантом пользовался класс-держатель:
class Ref<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
Вы можете, но вы не должны хранить его в своем классе.
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
небезопасно в буквальном смысле.