Swift,当引用一个类属性时,它是否在复制数据?

时间:2018-08-11 01:24:52

标签: swift

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

所以这是我的假设,如果其中任何一个错误,请告诉我:

  • 在Swift中,除类和函数外,所有内容均通过值传递。
  • 类实例(对象)在堆上分配
  • 传递对象时,传递的是指针
  • 在对象上引用属性时,指针将被取消引用,并且该属性的值将被获取

所以这是我的困惑,例如我的print_help()具有class属性和String属性。这两种Swift数据类型在任何普通情况下都可以通过值传递。

如果我要求Int,我是否要把字符串值的副本复制到我的let test = object.stringProperty变量中?

类似地,如果我在类中有一个方法,

test

func getAllProperties() -> (String, Int) { return (self.stringProperty, self.intProperty) } 是否要在元组中返回属性的副本?

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

1 个答案:

答案 0 :(得分:7)

是和是。 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