如何通过引用分配Swift结构?

时间:2015-09-03 15:45:35

标签: swift struct reference cgrect

众所周知,在Swift中,类是引用对象,而其他数据类型的结构是值类型。我试图将CGRect的引用转换为变量,因此我可以使用较短的名称来更改其值。有没有办法实现这个目标?在这里尝试使用Objective-C或C ++指针语法是没有用的:(

let reference = someView.frame
frame = ...

如果我保持在视图级别它没关系,因为它是引用类型,但我想在引用中包含该帧。

2 个答案:

答案 0 :(得分:1)

你可能真的不想使用引用...我可能错了,你可能有充分的理由想要引用。但是看看你想要做什么,这可能是一个更好的方法:

  1. 将您要使用的frame分配给变量:

    var workingFrame = someView.frame

  2. 使用副本,进行您想要进行的任何更改:

    workingFrame = someNewRect

  3. someView.frame更新为新值:

    someView.frame = workingFrame

  4. 从技术上讲,有一种直接处理内存地址指针的方法,但除非你有一个非常好的理由去那里,我认为大多数人会建议你避免它。

    [编辑:]

    如果您真的想尝试使用指向内存地址的指针,那么您可能需要查看UnsafePointer<T>UnsafeMutablePointer<T>unsafeBitCast:unsafeAddressOf:。这些类型和函数将为您提供指向结构的指针。

    例如,您可以获得一个指向Int值的可变指针,如下所示:

    let x = 5
    
    let ptr: UnsafeMutablePointer<Int> = UnsafeMutablePointer(unsafeAddressOf(x))
    

    不鼓励使用这种方式处理值,指针和内存地址,但是,是的,这是可能的。

    但是,使用unsafeAddressOfInt转换为类,所以即使这不是指向原始结构的指针。您可能最终需要初始化UnsafeMutablePointer,为其分配内存,然后为该内存分配值。然后,您可以对该内存地址的数据执行操作。查看UnsafeMutablePointer here.

    的文档

    如果您能够提供更多关于您正在尝试做什么的详细信息,那么可能会有更优雅的解决方案。 Swift并不能轻松使用指针,但它通常提供其他工具,使您能够以不同的方式完成所需的工作。

答案 1 :(得分:-3)

以下是解决方案:

func pointerTo<T>(inout object: T) -> UnsafeMutablePointer<T> { 
    return withUnsafeMutablePointer(&object) {UnsafeMutablePointer<T>($0)}
}