Structs와 클래스의 차이점을 이해하려면 값과 참조 유형의 주요 차이점을 알아야합니다. 구조는 값 유형이며, 그에 대한 모든 변경은 해당 값만 수정하고, 클래스는 참조 유형이며, 참조 유형의 모든 변경은 해당 메모리 또는 참조 위치에 할당 된 값을 수정합니다. 예를 들면 다음과 같습니다.
클래스로 시작하겠습니다.이 클래스는 인스턴스를 비교할 수 있도록 Equatable을 준수합니다. 인스턴스를 만들고 pointClassInstanceA
다른 pointClassInstanceB
클래스를 클래스 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
자, pointsClassInstanceB의 x 값을 변경하면 pointClassInstanceA의 x 값도 변경된 이유는 무엇입니까? 글쎄, 이것은 인스턴스 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
우리는 기본적으로 클래스와 동일한 구조를 가지지 만 이제 pointStructInstanceA의 x 값을 인쇄 할 때이 값이 변경되지 않았으며 값 유형이 다르게 작동하고 인스턴스 중 하나에 대한 모든 변경이 " 독립적 인 "및 다른 영향을 미치지 않습니다.
Swift는 더 많은 값 유형을 사용하도록 제안하며 라이브러리가 의도하지 않은 값 수정 등과 같은 참조 유형으로 인해 발생하는 문제를 피하기위한 구조체를 기반으로한다는 것을 알 수 있습니다. Structs는 Swift를 진행하는 방법입니다. 도움이 되길 바랍니다.