[TIL] 21.03.26.(Fri)


アクティビティの内容

  • 計算機プロジェクト符号化前クラスDiagram設計
  • 学習内容


    リンクの配置

    構造体とクラス、およびプログラムの定数と変数に基づいて変更値を宣言できるかどうかを考察します。


    構造体とクラスを学習する場合、構造体は値タイプ、クラスは参照タイプであり、異なる場合があります.実際のコードを記述する過程で、まず、実際のメモリで何が起こったのか、使用とパフォーマンスの違いを理解しますが、実際のコードを記述する過程で、どのような状況が簡単に利用できるのか、どのような状況が変更できないのかを理解します.
    場合によっては、タイプインスタンスの作成時に定数と変数として宣言し、内部プロファイルを定数と変数として宣言する4つのケースがあります.ここでは、2つのタイプのクラスと構造を決定する必要があります.結果は8種類になります.以下にまとめる.
  • 類または構造体(2種)
  • インスタンスの作成時に定数として宣言し、両方の場合に変数として宣言します(
  • ).
  • タイプの内部インスタンスPropertyは、定数、変数(2つの場合)
  • として宣言されます.

    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.結論


    現象の理解はさらに深まる必要があるが,現在は値タイプと参照タイプの違いによるものと考えられる.値自体をコピーしてインスタンスを作成する構造体では、インスタンスを定数として宣言すると変更できません.値を参照して作成されたクラスインスタンスは、ボリュームインスタンスプロセスの値を変更してもインスタンス参照のアドレスは変更されないため、変更可能とみなされます.