構文の切り替え:インスタンスの作成と削除


インスタンスの作成


定義
  • Initializerは、初期化プロセス
  • を直接実施することができる.
  • イニシエータ→新しいインスタンスを作成する特別な方法
  • SWIFTでは、イニシエータ初期化戻り値X→頭文字Riserの役割は、
  • を初めて使用するためにインスタンスを初期化するだけである.
    メソッド
  • func、キーワードなし
  • class SomeClass{
    	init(){
    	}
    }
    
    struct SomeStruct{
    	init(){
    	}
    }
    
    enum SomeEnum{
    	case someCase
    	
    	init(){
    		self = .selfCase
    	}
    }
    //클래스나 구조체는 init 이 비워있어도 되지만, 열거형은 초기화할 때 반드시 case 중 하나가 되어야 함

    属性のデフォルト

  • 構造体およびクラスのインスタンスを最初に作成する場合は、外部変数に加えて、すべてのストレージ・プロシージャに適切な初期値を割り当てる必要があります.
  • しかし、最初にpropertyを定義際に、propertyのデフォルト値を先に指定すると、以降の頭文字Riserに初期値
  • を単独で指定する必要はない.
    struct Area{
    	var squareMeter: Double
    	
    	init(){
    		squareMeter = 0.0  //Default Value 를 미리 작성하는 것
    	}
    }
    
    let room: Area = Area()
    print(room.squareMeter) //0.0
    **初期化後に不確定な値が存在しないストアド・プロシージャ
    →init()関数でデフォルト値を指定することもできますが、propertyで直接デフォルト値を指定することもできます.
    struct Area{
    	var squareMeter: Double = 0.0
    }
    
    let room: Area = Area()
    print(room.squareMether) //0.0

    イニシャルRiserパラメータ(Parameters for Initializer)

  • init()を呼び出すときに
  • にパラメータを入れることもできます.
    struct Area{
    	var squareMeter: Double
    	
    	init(fromPy py: Double){
    		squareMeter = py * 3.3
    	}
    	
    	init(fromSquareMeter squareMeter: Double){
    		self.squareMeter = squareMeter
    	}
    	
    	init(value: Double){
    		squareMeter = value
    	}
    	
    	init(_ value: Double){
    		squareMeter = value
    	}
    }
    
    let roomOne: Area = Area(fromPy: 15.0)
    
    let roomTwo: Area = Area(fromSquareMeter: 33.06)
    →上記のように複数のイニシエータを使用できます.

    ファイバタイプ(Optional Property Type)

  • 初期化中、一定値でないプログラムがある場合は、「オープン」
  • と宣言できます.
  • 自動nil割当
  • class Person{
    	var name: String
    	var age: Int?
    	
    	init(name: String){
    		self.name = name
    	}
    }

    ていすうとくせい

  • 定数として宣言されたPropertyは、インスタンスの初期化時にのみ値を割り当てる→以降の値は
  • を変更できません.
    **定数propertyは独自のクラスでのみ初期化→継承されたサブクラスでは定数propertyを初期化できません
    class Person{
    	let name: String
    	var age: Int?
    	
    	init(name: String){
    		self.name = name
    	}
    }
    
    let yagom: Person = Person(name: "yagom")
    yagom.name = "Eric"   //오류 발생!

    デフォルトの頭文字RiserとメンバーワイルドカードInitializer


    Default Initializer:
  • の傍観者タイプではなく、すべてのストレージ・プロシージャに初期値が設定されている場合は、デフォルトの頭文字Riser
  • を使用できます.
  • は、カスタム頭文字Riserが定義されていない場合に提供される.
  • Memberwise Initializer:
  • 初期化では、すべてのストレージ・プロシージャの名前と割り当てられる値がパラメータとして使用されます.
  • クラス提供Memberwise Initializer X→構造体提供
  • struct Point{
    	var x: Double = 0.0
    	var y: Double = 0.0
    }
    
    struct Size{
    	var width: Double = 0.0
    	var height: Double = 0.0
    }
    
    let point: Point = (x: 0, y: 0)
    let size: Size = Size(width: 50.0, height: 50.0)
    //위와 같이 매개변수로 프로퍼티의 이름과 할당할 값을 모두 포함하여 전달함.
    
    let somePoint: Point = Point()
    let someSize: Size = Size(width:50)
    //width 에만 값을 할당하고 싶으면 그렇게 해도 됨
    //그럼 자동으로 height 는 0.0 으로 초기화됨
    let anotherPoint: Point = Point(y:100)
    //위도 마찬가지
    **Memberwise Initializerは構造体にのみ適用されます!クラスX

    イニシャル/委任の略語


  • Initializerは、インスタンスの初期化の一部を実行するために他の頭文字Lizerを呼び出すことができます.
    →そのためには、2つのユーザ定義init()関数が必要

  • 値タイプ(構造体、列挙)でのみ使用可能

  • クラスの初期化委任は継承されます
  • Why use? →コード重複を避ける
    struct Frame {
        var x: Int
        var y: Int
        
        init(x: Int, y: Int) {
            self.x = x
            self.y = y
        }
        
        init(y: Int) {
            self.init(x: 0, y: y) // 다른 이니셜라이저를 호출
        }
    }
    
    let rect = Frame(x: 10, y: 10)
    let originRect = Frame(y: 5)

    失敗する可能性のある頭文字Riser(Failable Initializer)

  • 初期化中に失敗する可能性のある頭文字Riser(init()→異常
  • の戻り値で外来
  • を生成する.
  • 初期化に失敗するとnil
  • に戻る
  • init?()使用
  • 構造体、列挙型およびクラスは、いずれも
  • を定義することができる.
  • 誤った伝達パラメータを受信すると
  • を初期化できない場合がある.
    struct Animal {
    
        let species: String
    
        init?(species: String) {
            if species.isEmpty { return nil } // nil 반환 시 return 사용
    		
            self.species = species
        }
    
    }
    //init?을 옵셔널로 설정하였기에 nil 반환이 가능₩
    //Animal? 도 옵셔널로 정의
    if let animal: Animal? = Animal(species: "Dog"){
    	print(animal.species)
    }
    else{
    	print("error initializing")
    }
    //Dog
    
    if let animal: Animal? = Animal(species: 2){
    	print(animal.species)
    }
    else{
    	print("error initializing")
    }
    //error initializing
  • 列挙型で有用→エラーが発生した場合は
  • を用いる.
    enum Student: String{
    	case elementary = "초등학생", middle = "중학생", high = "고등학생"
    
    	init?(koreanAge: Int){
    		switch koreanAge{
    		case 8...13:
    			self = .elementary
    		case 14...16:
    			self = .middle
    		case 17...19:
    			self = .high
    		default:
    			return nil   //이것도 init? () 으로 선언해서 가능한 것
    		}
    	}
    	
    	init?(bornAt: Int, currentYear: Int){
    		self.init(koreanAge: currentYear - bornAt + 1)  //초기화 위임!
    	}
    }
    
    var younger: Student? = Student(koreanAge: 25)
    print(younger)
    //nil
    
    younger = Student(rawValue: "고등학생")
    print(younger)
    //high

    モジュールまたは関数を使用してデフォルトの属性値を設定する

  • デフォルト値の設定は、割り当て値だけでなく、複雑な計算が必要な場合は、エンクロージャまたは関数を使用して値
  • を初期化するために使用できます.
    class SomeClass{
    	let someProperty: Int = {
    		
    		return result
    	}()
    }
    
    //result 는 Int 와 반드시 같은 타입이어야 함
    //즉, 반환 값의 타입은 동일
    →モジュールの後ろに括弧()を付けるのは、モジュールを実行するためです.カッコを付けない場合、propertyのデフォルト値はモジュール自体です.
    struct Student{
    	var name: String?
    	var number: Int?
    }
    
    class SchoolClass{
    	var students: [Student] = {
    		//여기서 반환값은 반드시 [Student]이어야 한다
    		var arr: [Student] = [Student]()
    	
    		for num in 1...15{
    			var student: Student = Student(name: nil, number: num)  //하나씩 증가
    			arr.append(student)
    		}
    	}()
    }
    
    let myClass: SchoolClass = SchoolClass()
    print(myClass.students.count)
    //15
    

    インスタンスの消失

  • 初期化器は
  • を実施することができる.
  • メモリにおいて、
  • はクラスインスタンスに関連するクリーンアップを実現することができる
  • Denitキーワード
  • を使用
  • *Deinitializerはクラスインスタンスにのみ適用されます.
  • →Deinitializerは1つしか実現できません
    →パラメータも括弧もない
    →オートコールなので、個別のコードでは呼び出せません
    class SomeClass{
    	deinit{
    		print("Instance will be deallocated")
    	}
    }
    
    var instance: SomeClass? = SomeClass()
    instance = nil
    →つまり、Denitコードを単独で実行するのではなく、instance=nil実行時にインスタンスが破棄され、破棄前にDenit{}が実行されます.ここでファイルを保存するか、ファイルを正しく閉じるなど、他の操作を実行できます.