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

How can I assign a Swift struct by reference?

我们知道,在Swift中,类是引用对象,而其他数据类型的结构是值类型。我正在尝试将 CGRect 的引用获取到变量中,以便我可以使用更短的名称更改其值。有没有办法做到这一点?尝试使用 Objective-C 或 C++ 指针语法在这里没有用:(

let reference = someView.frame
frame = ...

如果我停留在视图级别没问题,因为它是参考类型,但我想在参考中包含框架。

您可能真的不想使用参考资料...我可能是错的,您可能有充分的理由需要参考资料。但是看看你正在尝试做什么,这可能是一个更好的方法:

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

    var workingFrame = someView.frame

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

    workingFrame = someNewRect

  3. someView.frame更新为新值:

    someView.frame = workingFrame

从技术上讲,有一种方法可以直接处理指向内存地址的指针,但除非您有充分的理由去那里,否则我认为大多数人会建议您避免使用它。

[编辑:]

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

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

let x = 5

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

不鼓励以这种方式处理值、指针和内存地址,但是可以。

但是,使用 unsafeAddressOf 会将 Int 转换为 class,因此即使这样也不是真正指向原始结构的指针。您可能最终需要初始化一个 UnsafeMutablePointer,为其分配内存,然后为该内存分配一个值。然后就可以对该内存地址的数据进行操作了。查看 UnsafeMutablePointer here.

的文档

如果您能更详细地说明您正在尝试做什么,那么可能会有更优雅的解决方案。 Swift 使用指针并不容易,但它通常会提供其他工具,让您以不同的方式完成您需要的工作。

解决方法如下:

func pointerTo<T>(inout object: T) -> UnsafeMutablePointer<T> { 
    return withUnsafeMutablePointer(&object) {UnsafeMutablePointer<T>([=10=])}
}