如何在Swift中获取值类型的引用?

时间:2017-02-09 13:48:14

标签: swift

诸如struct和enum之类的值类型按值复制。是否有可能获得值类型变量的引用?

struct Test {}

let t = Test()
let s = t  // How to get a reference to t instead of a copy of t?

2 个答案:

答案 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/