構文の切り替え:構造体とクラス


構造とクラス
  • 構造体の例→値タイプ
  • クラスのインスタンス→参照タイプ
  • こうぞうたい
    struct BasicInformation{
    	var name: String
    	var age: Int
    }
    →インスタンス作成後、ピリオド(.)使用
  • let、varはいずれも
  • var info: BasicInformation = BasicInformation(name: "yagom", age: 25)
    //BasicInformation() 초기화를 해야하 함
    
    let info2: BasicInformation = BasicInformation(name: "jack", age: 21)
    info2.name = "alex"   //상수니까 변경 불가
    カテゴリ
  • 継承が受信されると、クラス名の後にコロン(:)が付けられ、親クラス名に
  • が付けられます.
    class Person{
    	var height: Float = 0.0
    	var weight: Float = 0.0
    }
    //기본값을 0.0으로 지정해주는 것.
    //프로퍼티만 정의해준 것임
  • インスタンスが生成されると、初期化時に頭文字Riserが使用されます.
  • **上記のコード例ではclass property値のデフォルト値が設定されていますので、初期化時にパラメータを渡す必要はありません.後で変更できます.
    注:swiftでは、インスタンスは「オブジェクト」よりもよく使用されます.
  • 構造とは異なり、インスタンスは参照タイプであるため、let宣言インスタンスによって内部属性値
  • を変更することができる.
    var yagom: Person = Person()
    yagom.height = 12.3
    yagom.weight = 12.42
    
    let jenny: Person = Person()
    jenny.weight = 24.3
    Deinitializer
  • は、インスタンスを参照する必要がなくなるときに、インスタンス
  • をメモリから解放するために使用される.
  • メソッド呼び出し
  • パラメータX、戻り値X
  • class Person{
    	var height: Float = 0.0
    	var weight: Float = 0.0
    
    	deinit{
    		print("소멸")
    	}
    }
    
    var yagom: Person? = Person()
    yagom = nil
    →Denitメソッドを単独で呼び出すのではなく、インスタンスにnil値を割り当てる場合は、自分でDenitを呼び出して破棄する
    構造とクラスの違い
  • 構造体は
  • を継承することができない.
  • 型鋳造はクラスインスタンス
  • のみを許容する.
  • Deinitはクラス
  • のみ
  • 参照カウントは、インスタンス
  • にのみ使用する.
    最大の違い:値タイプまたは参照タイプ**
    値タイプと参照タイプ
    →「何を伝えますか?」

  • 値タイプ:渡す値をコピー(call by value)

  • 参照タイプ:参照(アドレス)転送(call by reference)ex.ポインタ
    →ただしここでは*
    構造/値タイプex)
  • struct BasicInformation{
    	let name: String
    	var age: Int
    }
    
    var yagomInfo: BasicInformation = BasicInformation(name: "yagom", age: 99)
    yagomInfo.age = 100
    
    //friendInfo 에 yagomInfo 의 값을 "복사"하여 할당 (extra memory)
    var friendInfo: BasicInformation = yagomInfo
    
    print("yagom's age: \(yagomInfo.age)")
    print("friend's age: \(friendInfo.age)")
    
    friendInfo.age = 25
    //friendInfo 는 별도의 메모리를 할당 받았기 때문에 yagomInfo.age 에는 값 변경 X
    
    func changeBasicInfo(_ info: BasicInformation){
    	var copiedInfo: BasicInformation = info
    	copiedInfo.age = 1
    }
    
    changeBasicInfo(yagomInfo)
    print("yagom's age: \(yagomInfo.age)")
    //call by reference 가 아닌 call by value 이기 때문에 따로 값이 변경되지 않고 그대로 100임
    クラス/参照タイプex)
    class Person{
    	var height: Float = 0.0
    	var weight: Float = 0.0
    }
    
    var yagom: Person = Person()
    var friend: Person = yagom
    //yagom의 참조를 할당한다
    
    friend.height = 182.3
    print("yagom height: \(yagom.height)")
    //friend.height 을 바꿨음에도 불구하고 yagom.height 도 같이 변경된다
    //같은 메모리를 참조하기 때문
    
    func changePersonInfo(_ info: Person){
    	info.height = 155.2
    }
    
    changePersonInfo(yagom)
    print("yagom height: \(yagom.height)")
    //Call by reference 이기 때문에 실제 값이 변화되어 155.2 출력
    識別演算子
  • クラスインスタンス間の参照相は
  • を同時に用いる.
  • Identity Operator
  • var yagom: Person = Person()
    let friend: Person = yagom
    let anotherFriend: Person = Person()
    
    print(yagom === friend)  //true
    print(yagom === anotherFriend) //false
    print(friend !== anotherFriend) //true
    **スイッチの基本データ型はすべて構造化されています
    public struct String{
    	public init()
    }
  • String、Int、Array、Dictionary、Setなど
  • →これはすべての基本データ型が値型であることを意味する