如何通过引用分配 Swift 结构?
How can I assign a Swift struct by reference?
我们知道,在Swift中,类是引用对象,而其他数据类型的结构是值类型。我正在尝试将 CGRect 的引用获取到变量中,以便我可以使用更短的名称更改其值。有没有办法做到这一点?尝试使用 Objective-C 或 C++ 指针语法在这里没有用:(
let reference = someView.frame
frame = ...
如果我停留在视图级别没问题,因为它是参考类型,但我想在参考中包含框架。
您可能真的不想使用参考资料...我可能是错的,您可能有充分的理由需要参考资料。但是看看你正在尝试做什么,这可能是一个更好的方法:
将您要使用的 frame
分配给变量:
var workingFrame = someView.frame
使用副本,进行您想要进行的任何更改:
workingFrame = someNewRect
将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=])}
}
我们知道,在Swift中,类是引用对象,而其他数据类型的结构是值类型。我正在尝试将 CGRect 的引用获取到变量中,以便我可以使用更短的名称更改其值。有没有办法做到这一点?尝试使用 Objective-C 或 C++ 指针语法在这里没有用:(
let reference = someView.frame
frame = ...
如果我停留在视图级别没问题,因为它是参考类型,但我想在参考中包含框架。
您可能真的不想使用参考资料...我可能是错的,您可能有充分的理由需要参考资料。但是看看你正在尝试做什么,这可能是一个更好的方法:
将您要使用的
frame
分配给变量:var workingFrame = someView.frame
使用副本,进行您想要进行的任何更改:
workingFrame = someNewRect
将
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=])}
}