Swift,在引用类属性时,是否会复制数据?

标签 swift

因此,由于信息冲突,我有点困惑,只是想了解有关 Class 属性的内存分配的一些清晰信息。

这是我的假设,如果有任何错误,请告诉我:

  • 在 Swift 中,除了类和函数,一切都通过值传递。
  • 类实例(对象)分配在堆上
  • 当你传递一个对象时,你传递的是指针
  • 当你引用一个对象的属性时,指针被解除引用,属性的值被取回

所以这是我的困惑,假设我的 class 有一个 String 属性和一个 Int 属性。两种 Swift 数据类型,在任何普通情况下都按值传递。

如果我要求 let test = object.stringProperty,我是否会得到一份复制到我的 test 变量中的字符串值?

同样,如果我的类中有一个方法,

func getAllProperties() -> (String, Int) {
  return (self.stringProperty, self.intProperty)
} 

object.getAllProperties() 会返回元组中属性的副本吗?

我知道这似乎是一个基本问题,但在阅读了一些资料后,我最终比开始时更加不确定

最佳答案

是的,是的。 String 和 Int 一个类中并不重要。您要求的是 String 或 Int(或两者),它们是值类型,您得到了副本。

向自己证明这一点很容易,尤其是使用 String 时。只需对其进行一些更改,然后回头查看类实例所持有的内容:它将保持不变。

class C {
    var stringProperty : String
    init(string:String) {
        self.stringProperty = string
    }
}
let c = C(string:"hello")
var s = c.stringProperty
s.removeLast()
print(s) // hell
print(c.stringProperty) // hello

如果你想看到类作为引用的作用,创建两个相同的实例并对其中一个那些做一些事情:

class C {
    var stringProperty : String
    init(string:String) {
        self.stringProperty = string
    }
}
let c = C(string:"hello")
let d = c
c.stringProperty = "goodbye"
print(d.stringProperty) // goodbye

关于Swift,在引用类属性时,是否会复制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51795675/

相关文章:

ios - NSManaged 与 !运算符(operator)

ios - 删除第一个 View 上的导航标题栏

swift - 'fileprivate' 关键字在 Swift 中意味着什么?

ios - facebook登录按钮无法自定义? swift

ios - 复选框保存/加载 NSUserdefaults

ios - NSInternalInconsistencyException,在我关闭下一个场景后崩溃

swift - 隐藏和显示tableviewcell?

ios - 如何使用 iOS 为 AWS API Gateway (Swift) 生成的开发工具包

swift - 符合协议(protocol)的类作为 Swift 中的函数参数

swift - 在 tableview 中从 UIDatePicker 更新 UILabel