13-2. 初期化値タイプ、初期化クラス(1)


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

  • 構造体タイプは、モジュール内の初期化文を定義しない場合、各メンバーの初期化文を自動的に受け入れます.デフォルトの初期化文とは異なり、構造体はデフォルト値のない保存されたpropertyでも初期化文を受け入れます.
  • struct Size {
    	var width = 0.0, height = 0.0
    }
    
    let twoBytwo = Size(width : 2.0, height : 2.0)
    //다음과 같이 기본값을 설정하여 초기화 구문 없이도 구조체 초기화가 가능하다.
    let zeroByzero = Size()
    //다음과 같이 구조체의 프로퍼티에 초기값을 지정한 경우에는 별도의 초기화 없이도 인스턴스 생선이 가능하다.
  • 初期化文は、インスタンスの初期化部分を実行するために初期化文を呼び出すことができる.値タイプの場合、独自の初期化構文を作成する場合、selfを使用して値タイプから他の初期化構文を参照できます.initというキーワードを使用します.初期化文内のみself.initを呼び出すことができます.
  • struct Size {
    	var width : 0.0, height : 0.0
    }
    
    struct Point {
    	var x = 0.0, y = 0.0
    }
    //위의 두 구조체 값을 사용하는 Rect라는 새로운 구조체를 정의한다.
    
    struct Rect {
    	var origin = Point()
        var size = Size()
        init{}
        //일반 초기화 구문
        init(origin: Point, size : Size) {
        	self.origin = origin
            self.size = size
        }
        //두번째 사용자화 초기화 구문
        init(center : Point, size : Size) {
        	let originX = center.x - (size.width / 2)
            let originY = center.y - (size.height / 2)
            self.init(origin: Point(x : originX, y : originY), size : size)
        }
        //여기서의 특징은 self.init을 통해서 두 번쨰 사용자화 초기화 구문을 가져다가 새로운 초기화에 사용했다는 것이다.
    }  

    クラスの継承と初期化

  • の親から継承されたクラスを含むすべてのpropertyのすべてのクラスの保存されたpropertyは、初期化中に初期値を割り当てる必要があります.指定した初期化構文(指定した初期化器)は、クラスのプライマリ初期化構文です.クラスの場合、通常は指定された初期化構文はなく、クラスは1つしかありません.
  • 編の初期化構文(便利な初期化器)は、クラスに対して初期化構文をサポートする補助初期化構文である.初期化構文を指定するパラメータをデフォルト値に設定して、指定した初期化構文を同じクラスで呼び出すことができます.
  • init(parameters) {
     // statement
     }
     //다음은 지정된 초기화 구문이다.
     
     convenience init(parameters) {
     	//statement
    }
    //다음은 편의 초기화 구문이다. 앞에 convenience init이라는 키워드를 작성하여 사용한다.
    

    初期化構文の継承と再定義

  • 親初期化文は、特定の場合に継承されますが、安全で適切な場合に継承されます.親に割り当てられた初期化構文を再定義する場合は、上書き修飾子を作成する必要があります.
  • class Vehicle {
    	var numberOfWheels = 0
        var description : String {
        	return "\(numberOfWheels) wheel(s)"
        }
    }
    //자동차 클래스를 정의하였다. 
    let vehicle = Vehicle()
    print(vehicle.description)
    //0을 출력하게 된다.
    
    class Bicycle : Vehicle {
    	override init() {
        	super.init()
            numberOfWheels = 2
        }
    }
    //다음은 자동차 클래스를 상속하는 자전거라는 하위클래스를 정의한다.
    //이 클래스의 초기화 구문은 상위 클래스의 초기화 구문인 super.init()을 호출하는 것으로 시작한다.
    //하위 클래스의 초기화 구문이 초기화 프로세스의 2단계에서 사용자 정의없이 수행되고
    //상위 클래스가 인자가 없는 지정된 초기화 구문을 가지고 있는 경우, super.init()을 생략할 수 있다.
    
    class Hoverboard : Vehicle {
    	var color : String
        init(color : String) {
        	self.color = color
            //super.init() // 암시적으로 호출되었으므로 코드를 명시하지 않아도 자동호출된다.
        }
        
        override var description : String {
        	return "\(super.description)"
        }
    }
    //다음의 클래스는 Color프로퍼티만 설정한다. 
    //하위 클래스는 초기화 중 상속된 프로퍼티 변수 수정이 가능하지만 상수는 수정이 불가하다.
  • サブクラスが指定した初期化構文を定義していない場合、親クラスの指定した初期化構文はすべて自動的に継承されます.サブクラスがカスタム初期化構文を指定すると、すべての親の指定した初期化構文が自動的に継承されます.
  • 初期化構文編の初期化構文動作の指定


    以下の例
  • では、初期化文を指定し、初期化文を容易にし、初期化文を自動的に継承する動作が見られる.
  • class Food {
    	var name : String
        init(name : String) {
        	self.name
        }
        //지정 초기화 구문
        
        convenience init() {
        	self.init(name : "[unnamed]")
        }
        //편의 초기화 구문
    }
    
    let namedMeat = Food(name : "bacon)
    //namedMeat는 베이컨이라는 이름을 가지고 초기화를 거쳐 인스턴스가 생성된다.
    //다음 지정 초기화 구문을 통해 새로운 Food 인스턴스에 저장된 모든 것은 완벽하게 초기화 된다. 
    
    let mysteryMeat = Food()
    //이 mysteryMeat는 [unnamed]를 출력하게 된다.
    //이 클래스는 인자가 없는 init()의 편의 초기화도 제공한다. 
    
    class RecipeIngredient : Food {
    	var quantity : Int
        init(name : String, quantity : Int) {
        	self.quantity = quantity
            super.init(name : name)
        }
    //이 클래스는 위의 Food클래스를 상속하며, 생성자 호출 간 두개의 파라미터를 받아 초기화를 진행한다. 이 때 name파라미터는 상속한 클래스의 지정 초기화를 위해 사용된다. 
    	override convenience init(name : String) {
        	self.init(name : name, quantity : 1)
        }
    }
    //보는 것처럼 편의 초기화 구문은, 사용자가 인스턴스를 손쉽게 생성하는 경우와 그에 대한 초기화 상태를 미리 제공하는 것이다. 
    //따라서 지정 초기화화 편의초기화는 엄연히 다르며, 편의초기화 구문도 클래스 상속 시,
    //정상적으로 상속해야 하고, 생성자 재정의 시 override키워드를 붙여준다.
  • クラス初期化構文は定義前です.クラスのすべてのサブクラスが初期化構文を実装しなければならないことを示すために、必要な修飾語を作成できます.
  • class SomeClass {
    	required init() {
        	//statement
        }
    }
    //다음과 같은 경우 상속하는 모든 하위 클래스는 위의 초기화 구문을 구현해야 한다.
    
    class someSubclass : SomeClass {
    	required init() {
         // statement
        }
    }

    モジュールまたは関数を使用したデフォルトの構成値の設定


    保存したプログラムのデフォルト値にカスタムまたは設定が必要な場合は、モジュールを使用してプログラムにカスタムのデフォルト値を指定できます.この場合、インスタンスを初期化するたびにモジュールが呼び出され、戻り値がデフォルト値に割り当てられます.
    class SomeClass {
    	let someProperty : someType = {
        //클로저 안에 새로운 기본 값을 생성하고 선언한다 
        	return someValue
        }()
    }
    
    //아래의 예시는 체스 보드에서의 검정과 하얗의 색 값을 설정하기 위한 클로저로 초기화된다.
    
    struct Chessboard {
    	let boardColor : [Bool] = {
        	var temporaryBoard = [Bool]()
            var isBlack = false
            for i in 1...8 {
            	for j in 1...8 {
                	temporaryBoard.append(isBlack)
                    isBlack = !isBlack
                }
                isBlack = !isBlack
            }
            return temporaryBoard
        }()
        //인스턴스가 생성될 때마다, 클로저가 실행되고 boardColors의 기본값은 계산되고 반환된다.