2014-10-18 3 views
11

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

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

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

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

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

+0

Будет ли 'class' быть более подходящим для ваших целей? Они передаются по ссылке. Экземпляры 'struct' предназначены для передачи по значению. – sapi

+0

Это решит мою проблему, но это означает, что мне нужно дублировать существующую структуру структуры, такую ​​как CGRect, и выполнять преобразования взад и вперед. Я хочу избежать дублирования, если это возможно. – vbezhenar

+0

@sapi: все в Swift всегда передается по значению, если параметр не отмечен 'inout', и в этом случае он всегда передается по ссылке. – newacct

ответ

7

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

class Ref<T> { 
    var value: T 

    init(_ value: T) { 
    self.value = value 
    } 
} 
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 больше не указывает действительную память. UnsafeMutablePointer является небезопасным в буквальном смысле.

Смежные вопросы