Sobes.tech
Junior — Middle

Как да различим типовете данни, базирани на препратки, от типовете данни, които съхраняват стойности директно?

sobes.tech AI

Отговор от AI

В iOS (Swift и Objective-C) типовете данни се делят на стойностни типове (value types) и референтни типове (reference types).

  • Стойностните типове съхраняват данните директно. При присвояване или предаване към функция се създава копие на данните. В Swift към тях се отнасят структури (struct), изброявания (enum) и основни типове като Int, Double, Bool.

  • Референтните типове съхраняват препратка към област от памет, където се намират данните. При присвояване се копира препратката, не самите данни. Промените чрез една препратка са видими и през други. В Swift това са класове (class).

Как да ги различим:

  • В Swift, ако типът е обявен като struct или enum, това е стойностен тип.
  • Ако е обявен като class, това е референтен тип.

Пример:

struct Point {
    var x: Int
    var y: Int
}

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var p1 = Point(x: 0, y: 0)
var p2 = p1
p2.x = 10
print(p1.x) // 0 - копието не се промени

var person1 = Person(name: "Alice")
var person2 = person1
person2.name = "Bob"
print(person1.name) // Bob - и двете променливи сочат към един и същи обект

По този начин, по поведението при присвояване и промяна, може да се различават типовете, базирани на препратки, от тези, които съхраняват стойности директно.