[TIL] 21.03.26.(Fri)
15142 ワード
アクティビティの内容
学習内容
リンクの配置
構造体とクラス、およびプログラムの定数と変数に基づいて変更値を宣言できるかどうかを考察します。
構造体とクラスを学習する場合、構造体は値タイプ、クラスは参照タイプであり、異なる場合があります.実際のコードを記述する過程で、まず、実際のメモリで何が起こったのか、使用とパフォーマンスの違いを理解しますが、実際のコードを記述する過程で、どのような状況が簡単に利用できるのか、どのような状況が変更できないのかを理解します.
場合によっては、タイプインスタンスの作成時に定数と変数として宣言し、内部プロファイルを定数と変数として宣言する4つのケースがあります.ここでは、2つのタイプのクラスと構造を決定する必要があります.結果は8種類になります.以下にまとめる.
Structure(Structure)の値は、宣言に従って変更できます。
まず、タイプが構造体の場合を見てみましょう.まずタイプを定義します.
struct PersonStructure {
let name: String
var age: Int
var heightInCM: Double?
// mutating func changeName(to name: String) {
// self.name = name // 에러 발생! 상수형으로 선언된 인스턴스 프로퍼티를 변경할 수 없습니다.
// }
mutating func changeAge(to age: Int) {
self.age = age
}
mutating func changeHeight(to height: Double) {
self.heightInCM = height
}
}
PersonStructure
構造は、定数および変数と呼ばれるインスタンス・プロシージャname
と、値タイプのインスタンス・プロシージャをインスタンス・メソッドに変更するためのage
とを有する.1つの注釈付きmutating func
(mutating func
)は、changeName(to:)
インスタンスプロセスが定数として宣言されるため、使用できないインスタンスメソッドである.続けよう
let personStructure1 = PersonStructure(name: "Kio", age: 23)
var personStructure2 = PersonStructure(name: "Steven", age: 21)
name
およびpersonStructure1
の例は、同じpersonStructure2
構造体によって作成された例である.ただし、定数と変数として宣言される唯一の違いは、次のとおりです.まず、定数として宣言された
PersonStructure
インスタンスの値を変更してみます.personStructure1.name = "KangKyung" // 에러 발생! person1은 상수형 인스턴스이므로 변경할 수 없습니다.
personStructure1.age = 5 // 에러 발생! person1은 상수형 인스턴스이므로 변경할 수 없습니다.
personStructure1.changeAge(to: 7) // 에러 발생! person1은 상수형 인스턴스이므로 mutating 메서드를 사용할 수 없습니다.
personStructure1 = personStructure2 // 에러 발생! person1은 상수형 인스턴스이므로 다른 인스턴스를 할당할 수 없습니다.
以上のコードは、エラーの原因となるコードであることに注意してください.デフォルトでは、personStructure1
と宣言された構造体インスタンス(インスタンス自体を含む)では、内部インスタンスの変更は許可されず、let
を使用して内部プロパティの変更も許可されません.値タイプであり、定数として宣言されているため、操作プロセスが直感的に理解されます.後で、構造体インスタンスを定数として宣言した場合を体験しますが、この場合、インスタンスプロセスタイプを初期化せずに傍観者に設定するエラーを犯すことはできません.以降は付与できないので、
mutating func
に続きます.次に、変数として宣言された
nil
の例を見てみましょう.personStructure2.name = "DuckBok" // 에러 발생! name 인스턴스 프로퍼티는 상수형으로 선언되어 있으므로 변경할 수 없습니다.
personStructure2.age = 3 // 21 -> 3
personStructure2.changeAge(to: 8) // 3 -> 8
personStructure2.height = 180.7 // nil -> Optional(180.7)
personStructure2.changeHeight(to: 181.1) // Optional(180.7) -> Optional(181.1)
personStructure2 = personStructure1
上記の例では、personStructure2
インスタンスを除くすべてのインスタンスとインスタンスが自分で変更できることを示します.構造体の理解を以下にまとめる.
宣言に基づいてクラスの値を変更できるかどうか。
クラスの状況を見続けましょう.構造体に示すように、まずタイプを定義します.
class PersonClass {
let name: String
var age: Int
var height: Double?
// func changeName(to name: String) {
// self.name = name // 에러 발생! 상수형으로 선언된 인스턴스 프로퍼티를 변경할 수 없습니다.
// }
func changeAge(to age: Int) {
self.age = age
}
func changeHeight(to height: Double) {
self.height = height
}
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
構造と同様に、name
は、一定の例示的プロセスPersonClass
および可変の例示的プロセスname
およびage
を有する.height
はオープンであり、アルファベットRiserによって初期化されていないため、将来値を変更することなくheight
の割り当てが継続される.クラスは参照タイプであるため、インスタンス・メソッドでインスタンス・プロシージャを変更しても、メソッドにnil
キーワードを作成する必要はありません.ただし、mutating
メソッドは、定数インスタンスの構成を変更しようとするため、最初からコンパイルされません.インスタンスの作成を続行しますか?
let personClass1 = PersonClass(name: "Summer", age: 20)
var personClass2 = PersonClass(name: "Coda", age: 25)
changeName(to:)
とpersonClass1
のインスタンスが作成され、それぞれ定数と変数として宣言されます.構造例に示すように、それぞれのpropertyとボディを変更しようとします.まずはpersonClass2
!personClass1.name = "Coda" // 에러 발생! name은 상수형 인스턴스 프로퍼티이므로 변경할 수 없습니다.
personClass1.age = 3 // 20 -> 3
personClass1.changeAge(to: 10) // 3 -> 10
personClass1.height = 185.3 // nil -> Optional(185.3)
personClass1.changeHeight(to: 186.0) // Optional(185.3) -> Optional(186.0)
personClass1 = personClass2 // 에러 발생! personClass1은 상수형으로 선언되어 있으므로 다른 인스턴스를 할당할 수 없습니다.
上記の例では、インスタンスが定数として宣言されていても、インスタンスプロセスが変数として宣言されている場合、クラスは値を変更できます.もちろん、定数として宣言されたプロパティは変更できません.また、インスタンス自体に他のインスタンスを割り当てることができないことを制限します.クラスインスタンスの定数宣言は定数とみなされ、インスタンス参照のアドレスを変更できません.では、変数として宣言されたクラスインスタンスの例を見てみましょう.
personClass2.name = "Summer" // 에러 발생! name은 상수형 인스턴스 프로퍼티이므로 변경할 수 없습니다.
personClass2.age = 3
personClass2.changeAge(to: 10)
personClass2.height = 185.3
personClass2.changeHeight(to: 186.0)
personClass2 = personClass1
今回は,クラスインスタンス本人が別のインスタンスに置き換えられてもエラーは発生しない.いずれにしても、personClass1
のインスタンスで見られるように、クラスインスタンス宣言時personClass1
およびvar
は、インスタンス本人のアドレスが変更可能であるかどうかを示す.宣言方法や他のクラスの値を変更できるかどうかについて議論した以上、クラスも整理してみましょう.
ページのスクロールが面倒なので、構造体クリーンアップを再インポートします.
表中の構造体およびクラスインスタンスは、タイプのインスタンスpropertyを変数型(
let
)として宣言し、インスタンス作成時に定数型(var
)と宣言した場合、最も大きな差があります.値タイプの構造ではインスタンスプロセスは変更できませんが、インスタンスが定数であっても、参照タイプのクラスではプロセスを変更できます.n/a.結論
現象の理解はさらに深まる必要があるが,現在は値タイプと参照タイプの違いによるものと考えられる.値自体をコピーしてインスタンスを作成する構造体では、インスタンスを定数として宣言すると変更できません.値を参照して作成されたクラスインスタンスは、ボリュームインスタンスプロセスの値を変更してもインスタンス参照のアドレスは変更されないため、変更可能とみなされます.
Reference
この問題について([TIL] 21.03.26.(Fri)), 我々は、より多くの情報をここで見つけました https://velog.io/@ryan-son/TIL-21.03.26.Friテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol