構造体とクラスの違いを理解するには、値と参照型の主な違いを知る必要があります。構造体は値の型であり、それらのすべての変更はその値を変更するだけであり、クラスは参照型であり、参照型のすべての変更はメモリまたは参照のその場所に割り当てられた値を変更します。例えば:
クラスでレッツ・スタート、Equatableにこのクラスの準拠は、単にインスタンスを比較できるようにするには、我々はと呼ばれるインスタンスの作成pointClassInstanceA
と呼ばれ、他のpointClassInstanceB
クラスBに我々アサインクラスAを、今主張は、彼らが同じであることを述べています...
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値も変更されたのはなぜですか。これは、インスタンスBの値としてインスタンスAを割り当てた後、参照タイプがどのように機能するかを示しています。次に、どちらか一方の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値を出力しても変化しなかったことがわかります。これは、値の型の動作が異なり、インスタンスの1つに対するすべての変更が "独立」し、他には影響しません。
Swiftはより多くの値タイプを使用することを提案しており、それらのライブラリは構造体に基づいているため、参照タイプがもたらす問題(意図せずに値を変更するなど)を回避できます。構造体はSwiftを使用する方法です。それが役に立てば幸い。