10-1. 構成コンセプト、ストレージ/遅延ストレージの構成、計算の構成


propertyは、特定のクラス、構造体、または列挙タイプに値を関連付けます.格納されたPropertyはインスタンスの一部として定数と変数値を格納し、計算されたPropertyは格納値ではなく計算されます.計算されたpropertyはクラス、構造体、および列挙型によって提供され、格納されたpropertyはクラスおよび構造体によってのみ提供されます.また、propertyは、タイプ自体に関連付けることもでき、タイプpropertyと呼ばれる.値の変更を監視し、サブクラスが継承するPropertyに追加するために、Propertyオブザーバーを定義できます.

保存されたアイテム

  • が最も簡単な形式で格納するプログラムは、特定のクラスまたは構造体のインスタンスの一部として格納される定数または変数である.保存したプログラムのデフォルト値を指定するか、初期化中に初期値を設定または変更できます.定数も割り当てることができます.
  • struct FixedLengthRange {
    	var firstValue : Int
        var length : Int
    }
    
    var rangeOfThreeItems = FixedLengthRange(firstValue : 0, length : 3)
    rangeOIfThreeITems.firstValue = 6
    //다음과 같이 값의 수정, 저장이 모두 가능하다.
    
    let rangeOfOthers = FixedLengthRange(firstValue : 0, length : 2)
    rangeOfOthers.firstValue = 1
    //상수이므로 값이 변하지 않고 에러가 난다.
    //구조체는 값 타입이므로 인스턴스가 상수로 선언하면 수정이 불가하다.
    //클래스는 참조 타입이므로 인스턴스를 상수로 할당해도 수정이 가능하다.

    保存されたアイテムの遅延

  • 遅延ストレージのproperty(lazy storage property)は、最初の使用前に初期値を計算しないpropertyである.lazyキーワードで表します.この場合、インスタンスの初期化が完了しても初期値がない場合があります.したがって、遅延プロセスはvarキーを使用して変数として宣言する必要があります.プロセス定数は、初期化が完了するまで常に値を持たなければならないため、lazyとして宣言できません.これは、インスタンスの初期化が完了する前に不明な値が外部要因によって変更された場合に使用するのに適しています.
  • class DataImporter {
    	var filename = "data.text"
    }
    
    class DataManager {
    	lazy var importer = DataImporter()
        var data = [String]()
    }
    
    let manager = DataManager()
    manager.data.append("some Data")
    manager.data.append("some more Data")
    
    print(manager.importer.filename)
    //"data.text"를 출력하게 된다. 
    //위에서 lazy가 붙어 있으므로 importer 프로퍼티의 인스턴스는 
    //filename 프로퍼티를 조회할 때 처음 접근 시 생성된다.
    

    計算されたパーセント

  • に格納されたpropertyに加えて、クラス、構造体、および列挙型は、実際に格納されていない値の計算propertyを定義することもできる.getterとsetterを提供し、propertyの値を間接的にクエリーして設定します.
  • struct Point {
    	var x = 0.0, y = 0.0
    }
    // 점 구조체 정의하고 초기값을 설정함.
    struct Size {
    	var width = 0.0, height = 0.0
    }
    //사이즈 구조체 정의하고 초기값을 설정함.
    
    struct Rect {
    	var origin = Point()
        var size = Size()
        var center : Rect {
        	get {
            	let center X = origin.x + (size.width / 2)
                let center Y = origin.y + (size.height / 2)
                return Point(x : centerX, y : centerY)
            } set(newCenter) {
            	let center X = newCenter.x + (size.width / 2)
                let center Y = newCenter.y + (size.height / 2)
            }
        }
    }
    //Rect 구조체는 center라는 계산된 프로퍼티를 제공하는데 이를 위한 getter와 setter를 정의하게 된다.
    
    var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(Width : 0.0, height : 0.0))
    
    let initialSuqreCenter = square.center
    square.center = Point(x : 15.0, y : 15.0)
    
    print("Square.origin is now at\(square.origin.x), \(square.origin.y)")
    短いsetter宣言
  • を使用でき、setterが新しい値を設定するために名前を定義していない場合は、デフォルトの名前newValueを使用します.また、getterは暗黙的に式を返します.したがって、return式を使用する必要はありません.
  • struct Rect {
    	var origin = Point()
        var size = Size()
        var center : Rect {
        	get {
            	let center X = origin.x + (size.width / 2)
                let center Y = origin.y + (size.height / 2)
                //다음과 같이 return해주지 않아도 암시적 반환을 통해 작동한다.
            } set {
            	let center X = newValue.x + (size.width / 2)
                let center Y = newValue.y + (size.height / 2)
            }
        }
    }
    //다음과 같이 위 예시에서 사용한 newCenter를 쓰지 않고, newValue프로퍼티를 사용하게 된다.

    読取り専用計算の割合

  • setterはなく、getterのみの計算プログラムを読み取り専用計算プログラムと呼ぶ.常に値を返し、ポイント文でアクセスできますが、他の値は設定できません.
  • struct Cuboid {
    	var width = 0.0, height = 0.0, depth = 0.0
        var volume : Double {
        	return width * height * depth
        }
    }
    //get 키워드와 그것의 중괄호를 삭제하고 간편히 선언이 가능하다.
    let fourByFiveByTwo = Cuboid(width : 4.0, height : 5.0, depth : 2.0)
    print(ForByFivebyTwo)
    //다음과 같은경우 40을 출력한다.