swift構造体(Structures)とクラス(Class)の違い


同じ点:

  • は、属性(properties)
  • を定義することができる
  • は、方法(methods)
  • を定義することができる
  • は、
  • の値を取得するためにサブスクリプトを定義することができる.
  • は、インスタンス
  • を初期化するために初期化コンストラクタ(init)を使用することができる.
  • は、拡張
  • を使用することができる.
  • は、プロトコルを遵守することができ、プロトコル
  • を実装することができる.

    異なる点(クラス固有):

  • は親から継承することができ、
  • を継承することができる.
  • は、実行時にクラスインスタンスのタイプ、すなわち、実行時にインスタンスがどのクラスであるかを判断する
  • を検査および解釈することができる.
  • は、割り当てられたすべてのリソース、すなわちdeinit()メソッドを実装可能なアナライザ
  • を解放することができる.
  • 参照カウントには複数の参照がある、すなわち、インスタンスの参照カウントは1
  • より大きくてもよい.

    初期化方法のないstructureとClassを構築するには:

    struct Resolution {
        var width = 0
        var height = 0
    }
    ///
    class VideoMode {
        var resolution = Resolution()
        var interlaced = false
        var frameRate = 0.0
        var name: String?
    }
    

    この場合、ResolutionとVideoModeのインスタンスの作成方法は次のとおりです.
    ///Resolution 
    let someResolution = Resolution()
    let otherResolution = Resolution(width: 12, height: 12)
    ///VideoMode 
    let someVideoMode = VideoMode()
    

    初期化方法のあるstructureとClassを構築するには:

    struct Resolution {
        var width = 0
        var height = 0
        init(width: Int) {
        	self.width = width
      	}
    }
    ///
    class VideoMode {
        var resolution = Resolution()
        var interlaced = false
        var frameRate = 0.0
        var name: String?
        init(frameRate: Double) {
        	self.frameRate = frameRate
      	}
    }
    

    この場合、ResolutionとVideoModeのインスタンスの作成方法は次のとおりです.
    ///Resolution 
    let otherResolution = Resolution(width: 12)
    ///VideoMode 
    let someVideoMode = VideoMode(frameRate: 2.0)
    

    注意:
  • Structureは、オプション以外のプロパティに値があり、initメソッドを書き換えていないため、デフォルトでは2つの初期化メソッドがあります.パラメータなしで、すべてのプロパティが含まれています.
  • Structureには非オプション属性があり、この非オプション属性には初期値がなく、initメソッドを書き換えていない場合、すべての無値の非オプション属性を初期化する構築方法と、すべての属性を含む構築方法がデフォルトで追加されます.
  • Classは、オプション以外の属性に値があり、initを書き換えていない場合、パラメータなしの構築方法がデフォルトで追加されます.
  • Class非オプション属性が存在する値がない場合、initメソッドを書き換えて値のない非オプション属性
  • を初期化する必要があります.

    値タイプ-Structure

    let hd = Resolution()
    var hdDemo = hd
    print("\(hd.height)--\(hdDemo.height)")
    //hd:0--hdDemo:0
    hdDemo.height = 100
    print("hd:\(hd.height)--hdDemo:\(hdDemo.height)")
    //hd:0--hdDemo:100
    

    参照タイプ–Class

    let video = VideoMode()
    var videoDemo = video
    print("\(video.name)--\(videoDemo.name)")
    //nil--nil
    videoDemo.name = "name1"
    print("\(video.name)--\(videoDemo.name)--\(video === videoDemo)")
    //Optional("name1")--Optional("name1")--true
    

    このように、値タイプStructureは、インスタンスを渡すときに新しい変数にコピーされます.参照タイプClassは、インスタンスを渡すときにコピーをコピーするのではなく、既存のインスタンスを直接参照します.注意:1.let修飾の値タイプインスタンスを使用して、初期化後の属性値を変更することはできません.varはできます.2.swiftでは、整数、浮動小数点数、ブール値、文字列、配列、辞書ともに値タイプ
    言叶の论理に不适切なところがあれば、指摘してください!!!感謝><