Swiftクラスと構造体(Class And Structure)

3055 ワード

1.公式の説明クラスと構造体の違いを見てみましょう。


Classes and structures in Swift have many things in common. Both can:(同じ点)
  • Define properties to store values(属性を定義して値を格納)
  • Define methods to provide functionality(機能を提供する方法を定義する)
  • Define subscripts to provide access to their values using subscript syntax(下付き文字を定義してその値へのアクセスを提供する)
  • .
  • Define initializers to set up their initial state(初期化器を定義して初期状態を設定)
  • Be extended to expand their functionality beyond a default implementation(デフォルトの実装を超えた機能に拡張)
  • Conform to protocols to provide standard functionality of a certain kind(プロトコルに従って何らかの標準機能を提供する)
  • Classes have additional capabilities that structures do not:(クラスが持つ構造体にはない特徴)
  • Inheritance enables one class to inherit the characteristics of another.(継承は、あるクラスが別のクラスの特性を継承できるようにします.)
  • Type casting enables you to check and interpret the type of a class instance at runtime.(タイプ変換により、実行時にクラスインスタンスのタイプをチェックおよび解釈できます.)
  • Deinitializers enable an instance of a class to free up any resources it has assigned.(初期化プログラムをキャンセルして、クラスのインスタンスに割り当てられたリソースを解放します.)
  • Reference counting allows more than one reference to a class instance.(参照数は、クラスインスタンスへの複数の参照を許可します.)

  • 注:構造は、参照カウントを使用せずにコードで渡されると常にコピーされます.

    2.クラスは参照タイプ、構造体は値タイプ


    構造体とクラスの宣言
    struct Resolution {
       var width = 0
       var height = 0
    }
    class VideoMode {
       var resolution = Resolution()
       var interlaced = false
       var frameRate = 0.0
       var name: String?
    }
    
  • 初期化、構造体得自動生成の2種類の初期化方法
  • let someResolution = Resolution()
    let someResolution2 = Resolution(width: 29, height: 19)
    let somVideoMode = VideoMode()
    
  • 値タイプすべての構造および列挙は、Swiftの値タイプである.これは、作成した任意の構造および列挙インスタンス(および属性としての任意の値タイプ)が、コードで渡されるときに常にコピーされることを意味します.例えば、先生は別の
  • に割り当てられた構造体になります.
    let hd = Resolution(width: 1920, height: 1080)
    var cinema = hd
    
    cinemawidthが変更され、hdwidthは変更されず、cinemaが現在の値を与えるとhdは、その中に格納された値hdが新しいcinemaインスタンスにコピーされる.最終的な結果は、2つの完全に分離する例であり、それらはちょうど同じ数値を含む.この状況はすべての値タイプ、列挙、辞書、配列に適しています...
    cinema.width = 2048
    print("cinema is now \(cinema.width) pixels wide")
    // Prints "cinema is now 2048 pixels wide"
    print("hd is still \(hd.width) pixels wide")
    // Prints "hd is still 1920 pixels wide"
    
  • 参照タイプVideoModeクラス
  • を宣言
    let tenEighty = VideoMode()
    tenEighty.resolution = hd
    tenEighty.interlaced = true
    tenEighty.name = "1080i"
    tenEighty.frameRate = 25.0
    

    次に、tenEightyは新しい定数を割り当てられ、alsoTenEightyが呼び出され、alsoTenEightyframeRateを変更する.
    let alsoTenEighty = tenEighty
    alsoTenEighty.frameRate = 30.0
    

    tenEightyのframeRateプロパティは、参照タイプである30.0のままです.
    print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
    // Prints "The frameRate property of tenEighty is now 30.0"