Yapılar ve Sınıflar arasındaki farkı anlamak için değer ve referans türleri arasındaki temel farkı bilmemiz gerekir. Yapılar değer tipleridir ve bu, üzerlerindeki her değişikliğin sadece bu değeri değiştireceği, Sınıfların referans tipler olduğu ve referans tipindeki her değişikliğin o bellek veya referans yerine tahsis edilen değeri değiştireceği anlamına gelir. Örneğin:
Bir Sınıfla başlayalım, bu sınıf sadece örnekleri karşılaştırmak için Eşittir'e uyuyor, denilen bir örnek yaratıyoruz pointClassInstanceA
ve pointClassInstanceB
B sınıfına A sınıfı atadığımız diğer bir örnek oluşturuyoruz , şimdi iddia aynı olduklarını söylüyor ...
class PointClass: Equatable {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
static func == (lhs: PointClass, rhs: PointClass) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var pointClassInstanceA = PointClass(x: 0, y: 0)
var pointClassInstanceB = pointClassInstanceA
assert(pointClassInstanceA==pointClassInstanceB)
pointClassInstanceB.x = 10
print(pointClassInstanceA.x)
//this prints 10
Tamam, burada ne oldu, sadece pointsClassInstanceB'nin x değerini değiştirirsek, aynı zamanda pointClassInstanceA'nın x değerini de değiştirdi mi? Bu, referans türlerinin nasıl çalıştığını gösterir, A örneğini B örneğinin değeri olarak atadığımızda ve bunlardan birinin X'ini değiştiririz, aynı referansı paylaştıkları ve bunun değerinin ne olduğu değiştiğinden, her iki X'i de değiştirir referans.
Aynı şeyi yapalım ama bir yapıyla
struct PointStruct: Equatable {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
static func == (lhs: PointStruct, rhs: PointStruct) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var pointStructInstanceA = PointStruct(x: 0, y: 0)
var pointStructInstanceB = pointStructInstanceA
assert(pointStructInstanceA==pointStructInstanceB)
pointStructInstanceB.x = 100
print(pointStructInstanceA.x)
//this will print 0
Temelde sınıfımızla aynı yapıya sahibiz, ancak şimdi pointStructInstanceA'nın x değerini yazdırdığınızda bu durumun değişmediğini ve bunun değer türlerinin farklı çalıştığını ve örneklerinden birindeki her değişikliğin " bağımsız "ve diğerini etkilemez.
Swift, daha fazla değer türü kullanmanızı önerir ve kitaplıklarının referans türlerinin getirdiği sorunlardan kaçınmak için istem dışı bir değeri vb. Umarım yardımcı olur.