诸如struct和enum之类的值类型按值复制。是否有可能获得值类型变量的引用?
struct Test {}
let t = Test()
let s = t // How to get a reference to t instead of a copy of t?
答案 0 :(得分:4)
有几种方法可以获得参考。 Kristopher的Box
解决方案是最灵活的解决方案之一,可以构建为自定义框来处理将结构传递给ObjC等问题。
除此之外,最明显的是传递inout
个参数。这与引用并不完全相同,但它的行为可能非常相似,并且绝对可以成为高性能代码的一部分。
向下移动堆栈有UnsafePointer
及其朋友,在常规类型上使用withUnsafePointer(to:)
,在数组类型上使用.withUnsafeBufferPointer
。
但是如果你需要一个可以存储在属性中的持久性引用类型,那么你需要像Kristopher所描述的那样Box
。
(因为我没有记住它,只是为未来的读者捕捉它,但MartinR在评论中指出:as AnyObject
可以自动设置值类型。)
答案 1 :(得分:3)
典型的解决方案是使用Box<T>
引用类型来包装值类型。例如:
final class Box<T> {
let value: T
init(_ value: T) {
self.value = value
}
}
let t = Test()
let boxed = Box(t)
let anotherReference = boxed
let theValue = anotherReference.value
有关详细信息,请参阅https://www.natashatherobot.com/swift-generics-box/。