【问题标题】:How to get the reference of a value type in Swift?如何在 Swift 中获取值类型的引用?
【发布时间】:2017-02-09 13:48:13
【问题描述】:

struct 和 enum 等值类型是按值复制的。是否可以获取值类型变量的引用?

struct Test {}

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

【问题讨论】:

  • 为什么需要参考?用例是什么?
  • 一个很奇怪的问题。值类型是您希望按值传递的类型。如果需要引用,请使用引用类型。
  • 在 Swift 中,3 种值类型在转换为 AnyObject 时会“自动装箱”。
  • SE-0116: “没有明显的 Objective-C 类比的未桥接值类型仍然可以装箱在不可变类的实例中。...”

标签: swift


【解决方案1】:

有几种方法可以获得参考。 Kristopher 的Box 解决方案是最灵活的解决方案之一,可以构建为自定义框来处理诸如将结构传递给 ObjC 等问题。

除此之外,最明显的是传递inout 参数。这与引用并不完全相同,但它的行为可能非常相似,并且绝对可以成为高性能代码的一部分。

向下移动堆栈有UnsafePointer 和它的朋友,在一般类型上使用withUnsafePointer(to:),或者在数组类型上使用.withUnsafeBufferPointer

但是,如果您需要可以存储在属性中的持久引用类型,则需要 Box,如 Kristopher 所述。

(只是为了将来的读者捕捉它,因为我不记得了,但 MartinR 在评论中指出:as AnyObject 可以自动装箱值类型。)

【讨论】:

  • 谢谢!赞成克里斯托弗的回答和你的回答。选择此作为其完整性的答案。
【解决方案2】:

典型的解决方案是使用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/ 了解更多信息。

【讨论】:

  • 谢谢,很棒的信息!
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2015-05-06
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多