9-1. 構造体とクラス比較、構造体概念(struct)


構造体とクラスはプログラムコードコンポーネントとなる汎用構造である.定数、変数、関数の定義などの構文を使用して、構造体およびクラスにpropertyおよびメソッドを機能的に追加できます.sweetでは、クラスで使用される用語はオブジェクトよりも一般的です.

構造とクラスの比較

  • SWIFTでは,構造体とクラスに多くの共通点がある.
  • の値を格納するプロパティ定義
  • の機能を提供する方法定義(方法、機能)
  • サブスクリプト構文を使用して、値へのアクセスを提供する「定義」(Subscript)
  • 初期化を定義して
  • 初期化状態
  • を設定.
  • は、基本的な実装ではなく
  • に拡張される.
  • プロトコルコンプライアンス(プロトコル)
  • 特定のタイプの標準機能を提供
  • 類には構造体にない付加機能がある.
  • 継承を使用すると、あるクラスは別のクラスの特性を継承できます.
  • タイプの鋳造を使用して、実行時にクラスインスタンスのタイプを確認および説明できます.
  • の初期化解除」(Deinit)を使用して、クラスインスタンスが割り当てたリソースを無効にします.
  • カウントを参照すると、1つ以上のクラスインスタンス参照が許可されます.
  • その結果、クラスは複雑な追加機能をサポートします.一般ガイドとして推論しやすい構造体を選択し,クラスを適切または必要に応じて使用する.実際には、ほとんどのカスタムデータ型は構造体と列挙型です.
  • クラスおよび構造体は、類似の定義構文を有する.
  • struct SomeStructure {
    //구조체 정의
    }
    
    class someClass {
    //클래스 정의
    }

    構造およびクラスインスタンス

  • の次の例では、Resolution構造体定義およびVideoModeクラス定義は、それぞれの形状のみを示す.独自の解像度またはビデオモードは提供されません.これらの自己説明を行うには、インスタンスを作成する必要があります.
  • struct Resolution {
    	var width = 0
        var height = 0
    }
    
    class VideoMode {
    	var resolution = Resolution()
        var interlaced = false
        var frameRate = 0.0
        var name : String?
    }
    //다음 구조체와 클래스는 각각 프로퍼티를 가진다.
    //저장된 프로퍼티는 구조체와 클래스 내 묶여 저장되는 상수 또는 변수이다.
  • 構造体およびクラスは、新しいインスタンスの初期化構文を使用します.初期化構文は、以下に示すように、各名前の後に()カッコを付けます.ここで作成したインスタンスのプロパティにアクセスし、インスタンスの後にポイント(.)を付けることができます.変数または定数名を追加してアクセスできます.
  • let someResolution = Resolution()
    let someVideoMode = VideoMode()
    
    //다음과 같이 각 인스턴스를 생성한다. 이게 무슨의미냐면 결과적으로는 각 구조체와 클래스에 틀에
    //해당하는 데이터를 저장하고 핸들링하는 일종의 틀을 선언하는 것이다.
    //클래스는 주형틀과도 같다. 내가 동을 넣으면 동전, 철을 넣으면 칼이 나온다.
    
    print("\(someResolution.width)")
    //다음과 같은 경우 0을 출력한다.
    //someResolution에 프로퍼티 width를 참조하고 그 기본값 0를 반환하다.
    
    someVideoMode.resolution.width = 1280
    print(someVideoMode.resolution.width)
    //1280을 출력하게 된다.

    構造体タイプのメンバーによる構文の初期化

  • すべての構造体は、新しい構造体インスタンスを初期化するために使用できるメンバープロパティの自動生成されたメンバー別初期化文を有する.
  • let vga = Resolution(width : 640, height : 480)
    //다음과 같이 새로운 구조체 값을 가지는 상수를 선언할 수 있다.
  • 構造体とは対照的に、クラスインスタンスは各メンバーの初期化を受け入れない.
  • 構造体および列挙型は値型である.(valuetype)値タイプとは、変数または定数に割り当てられたり、関数に渡されたりしたときにコピーされるタイプです.実際,SWIFTでは,Int,Double,Float,Bool,String,Array,Character,Dictionaryなどが価値型であり,いずれも構造体で実現されている.構造体は値タイプであり、生成された構造体または列挙型のすべてのpropertyが転送時にコピーされることを意味します.
  •   let hd = Resolution(width : 1920, height : 1080)
      var cinema = hd
      cinema.width = 2048
      print(cinema.width)
      //2048을 출력한다. 마치 변수에 상수를 담고 변수값을 변환해 준 것같이 자연스럽게 계산된다.
      print(hd.width)
      //1920을 그대로 가지고 있다. 
      
      //이것은 cinema에 hd의 현재값이 주어질 때 새로운 인스턴스에 복사가 된다. 
      //그래서 이 둘은 완전하게 다르고 분리된 2개의 인스턴스이다. 따라서 서로 영향이 없는 것이다.
    
  • 列挙型でも同様の動作が現れる.
  • enum CompassPoint {
      	case north, south, east, west
      	mutating func turnNorth() {
      	self = .north
        }
    }
    
    var currentDirection = CompassPoint.west
    let rememberedDirection = currentDirection
    currentDirection.turnNorth()
      
    print(currentDirection)
    //north를 출력하게 된다.
    print(rememberedDirection)
    //west를 출력하게 된다.
    //열거형도 마찬가지로 값이 복사되고 서로 완전히 다른 2개의 인스턴스를 생성하게 된다.