繁体   English   中英

如何通过引用分配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转换为类,因此即使这实际上并不是指向原始结构的指针。 您可能最终需要初始化UnsafeMutablePointer ,为其分配内存,然后为该内存分配一个值。 然后,您可以对该内存地址上的数据执行操作。 在此处查看UnsafeMutablePointer的文档

而且,如果您可以提供有关正在尝试执行的操作的更多详细信息,则可能会有更优雅的解决方案。 Swift并不容易使用指针,但是它经常提供其他工具,使您能够以不同的方式完成所需的工作。

解决方法如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM