如何通过引用传递结构?

如何通过引用传递结构?

问题描述:

如果我有一些现有的结构,但我想使用“参考”行为,我该如何实现?如何通过引用传递结构?

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

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

我想一定是在标准库准备好类,但我没有找到它。

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

+0

会了'class'更适合你的目的是什么?他们通过引用传递。 'struct'的实例被设计为按值传递。 – sapi 2014-10-18 06:27:25

+0

这将解决我的问题,但这意味着我必须复制CGRect等现有框架结构并实现来回转换。如果可能,我想避免重复。 – vbezhenar 2014-10-18 06:34:49

+0

@sapi:Swift中的所有东西总是按值传递,除非参数被标记为'inout',在这种情况下,它总是被引用传递。 – newacct 2014-10-19 03:58:18

对我来说最好的变种使用类持有人:

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