[オブジェクト向けプログラミングとswift]構造とクラス


構造体とクラスは、プログラマがデータを用途別に整理しようとするときに役立ちます.この2つの大きな違いは、構造体のインスタンスが値タイプであり、クラスのインスタンスが参照タイプであることです.
💡 こうぞうたい
構造体はstructキーワードによって定義されます.定義構造体は、新しいタイプを作成するのと同じであるため、Int、Float、Stringなどの大文字のシェルを使用して名前を付けることができます.
struct Student {
    var name: String
    var age: Int
}
構造体を定義する場合は、構造体のインスタンスを作成する必要があります.構造体でデフォルトで作成されたメンバーとアルファベットlizerを使用して、インスタンスを作成および初期化できます.
var myInfo: Student = Student(name: "silverCastle", age: 24)
print("제 이름은 \(myInfo.name)입니다.")
print("제 나이는 \(myInfo.age)입니다.")
結果
제 이름은 silverCastle입니다.
제 나이는 24입니다.
もし、letで構造体を宣言したら?
構造体のインスタンスは値タイプであるため、インスタンス内部のプロパティ値は変更できません.
let yourInfo: Student = Student(name: "bronzeCastle", age: 25)
yourInfo.name = "goldCastle"
結果
Cannot assign to property: 'yourInfo' is a 'let' constant
💡 カテゴリ
クラスはclassキーワードで定義されます.クラスも構造体と同様に、大文字のcamel caseを使用して名前を付けます.
クラスを定義する方法は構造体と似ていますが、クラスは継承できます.したがって、継承する場合は、クラス名の後に(:)というコロンを書き、親を指定します.
もし、クラスをletと宣言したら?
クラスのインスタンスは参照タイプであるため、インスタンス内のProperty値を変更できます.
class Person {
    var height: Float = 0.0
    var weight: Float = 0.0
}

var me: Person = Person()
me.height = 175
me.weight = 74
print("내 키는 \(me.height)입니다.")
print("내 몸무게는 \(me.weight)입니다.")

let you: Person = Person()
you.height = 156
you.weight = 50
print("당신의 키는 \(you.height)입니다.")
print("당신의 몸무게는 \(you.weight)입니다.")
結果
내 키는 175.0입니다.
내 몸무게는 74.0입니다.
당신의 키는 156.0입니다.
당신의 몸무게는 50.0입니다.
また、クラスのインスタンスは、リファレンスが不要になったときにメモリから解放され、破棄と呼ばれます.消える前にDenitメソッドが呼び出されます.denitメソッドの特徴は,クラスごとに1つしか実現できず,パラメータと戻り値を持つことができないことである.
class Person {
    var height: Float = 0.0
    var weight: Float = 0.0

    deinit {
        print("Person 클래스의 인스턴스가 소멸됩니다.")
    }
}
var me: Person? = Person()
me = nil
結果
Person 클래스의 인스턴스가 소멸됩니다.
💡 構造とクラスの違い공통점
  • 値を格納するためにpropertyを定義できます.
  • 機能を実行する方法を定義できます.
  • サブスクリプト構文により、サブスクリプトを定義して、構造体またはクラスが持つ値にアクセスできます.
  • 頭文字Liserを定義して、
  • の初期化時の状態を指定できます.
  • が最初に実装されると同時に、Extensionによって拡張され、新しい機能を追加することもできる.
  • は、特定の機能を実行するために特定のプロトコルを遵守することができる.
  • 차이점
  • 構造体は継承できません.
  • 型鋳造は、クラスインスタンスでのみ可能である.
  • デジタル署名はクラスインスタンスにのみ使用できます.
  • クラスのインスタンスは参照タイプであるため、参照カウントはクラスのインスタンスにのみ適用されます.
  • 前述したように、最大の違いは、構造体のインスタンスが値タイプであり、クラスのインスタンスが参照タイプであることです.たとえば、関数の伝達パラメータで値タイプの値を伝達すると、伝達する値がコピーされて伝達されますが、参照タイプが伝達パラメータである場合、値はコピーされず、参照が伝達されます.ここで参照をアドレスとします.구조체
    struct Student {
        var name: String
        var age: Int
    }
    
    var myInfo: Student = Student(name: "silverCastle", age: 24)
    myInfo.age = 100
    
    var yourInfo: Student = myInfo
    
    print("내 나이는 \(myInfo.age)입니다.")
    print("당신의 나이는 \(yourInfo.age)입니다.")
    
    yourInfo.age = 200
    print("내 나이는 \(myInfo.age)입니다.")
    print("당신의 나이는 \(yourInfo.age)입니다.")
    結果
    내 나이는 100입니다.
    당신의 나이는 100입니다.
    내 나이는 100입니다.
    당신의 나이는 200입니다.
    클래스
    class Person {
        var height: Float = 0.0
        var weight: Float = 0.0
    }
    
    var me: Person = Person()
    me.height = 175
    me.weight = 74
    
    let you: Person = me
    
    print("내 키는 \(me.height)입니다.")
    print("당신의 키는 \(you.height)입니다.")
    
    you.height = 156
    
    print("내 키는 \(me.height)입니다.")
    print("당신의 키는 \(you.height)입니다.")
    
    結果
    내 키는 175.0입니다.
    당신의 키는 175.0입니다.
    내 키는 156.0입니다.
    당신의 키는 156.0입니다.
    
    構造体とクラスの異同が分かった.では、構造体はいつ使用し、クラスはいつ使用しますか?
    アップル社はガイドラインで、以下の条件の1つを適用すれば構造体を使用することを提案した.
  • の目的は、単純な関連値セット
  • をカプセル化することである.
    コピー値が
  • でカプセル化された値と比較すると、コピー値が
  • である場合
  • 構造体に格納プロパティが値タイプであり、参照よりもコピーが適切である場合、
  • .
  • 他のタイプから継承する必要がない場合または自分で継承する必要がない場合
  • .