Чтобы понять разницу между структурами и классами, нам нужно знать основное различие между типами значений и ссылками. Структуры являются типами значений, и это означает, что каждое изменение в них будет просто изменять это значение, классы являются ссылочными типами, а каждое изменение в ссылочном типе будет изменять значение, выделенное в этом месте памяти или ссылки. Например:
Давайте начнем с Класса, этот класс соответствует Equatable просто для того, чтобы иметь возможность сравнивать экземпляры, мы создаем вызываемый экземпляр pointClassInstanceAи другой вызываемый, pointClassInstanceBмы назначаем класс A классу B, теперь утверждение говорит, что они одинаковы ...
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
Хорошо, что здесь произошло, почему, если мы просто изменили значение x для pointsClassInstanceB, оно также изменило значение x для pointClassInstanceA? хорошо, это показывает, как работают ссылочные типы, когда мы присваиваем экземпляр A в качестве значения экземпляра B, а затем мы модифицируем X одного из них, он изменит оба X, потому что они имеют одну и ту же ссылку, и то, что изменилось, было значением этого ссылка.
Давайте сделаем то же самое, но со структурой
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
Мы в основном имеем ту же структуру, что и наш класс, но теперь вы можете видеть, что когда вы печатаете значение x для pointStructInstanceA, этот случай не меняется, и это происходит потому, что типы значений работают по-разному, и каждое изменение в одном из их экземпляров будет " независимый "и не повлияет на других.
Swift предлагает использовать больше типов значений, и вы можете сказать, что их библиотеки основаны на структурах, чтобы избежать проблем, которые вызывают ссылочные типы, таких как непреднамеренное изменение значения и т. Д. Структуры - это путь к Swift. Надеюсь, поможет.