[Swift🦩] #10パーセント


  • struct、class、enumで宣言できます.概ね特定のタイプのインスタンスです.
  • ストレージ・プロシージャはstruct、classでのみ宣言できます.
  • 値の変化は、
  • Propertyオブザーバによって監視され、特定の動作を実行することができる.
  • 1. Stored Property ⭐️


    保存された定数、変数.
    struct FixedLengthRange {
        var firstValue: Int
        let length: Int
    }
    var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // 0, 1, 2
    rangeOfThreeItems.firstValue = 6 // 6, 7, 8
    
    let rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // 0, 1, 2
    rangeOfThreeItems.firstValue = 6 // let 으로 선언했기 때문에 불가능.
    // 하지만 class 라면? 가능. 
    // rangeOfThreeItems = FixedLengthRange(firstRange: 1, elength: 4) 처럼 
    // 아예 새로운 변수를 할당하는 것은 불가능.

    lazy


    使用前に初期値を計算しないプログラム.
    初期化が完了しても初期値がない場合がありますので、varとして宣言する必要があります.letと宣言した場合、初期化前に値を持たなければならないため、遅延することはできません.
    lazy var tableView: UITableView = {
        let v = UITableView()
        v.register(UITableViewCell.self, reuseIdentifier: "cell")
        v.delegate = self
        v.dataSource = self
        return v
    }()

    2. Computed Property ⭐️⭐️


    実際に値を保存するのではなく、別のプロパティの値を間接的に取得して設定します.getter, setter
    let start = 0
    var end = 10
    var mid {
        get { return (start + end) / 2 }
        // set(newMid) { end = 2 * newMid }
        set { end = 2 * newValue } // 자동 제공.
    }
    var readOnlyMid {
        return (start + end) / 2
    }

    3. Property Observer ⭐️⭐️


    propertyの値が変化しているかどうかを観察し、応答します.
    新しい値が現在の値と同じであっても、propertyで値を設定したときに呼び出されます.
  • 定義ストレージ製品
  • が継承するストレージ製品
  • が継承する計算プログラム
  • に追加できます.(グローバル変数や定義された計算プログラムには適用されません)
  • willset:値を保存する前に呼び出されます.(newValueとして格納可能な値)
  • didSet:新しい値が保存されると呼び出されます.(oldValueとして保存された値が使用可能)
  • 注意:ここで自分を再設定したら?無限ループであってもよい.
    class StepCounter {
        var totalSteps: Int = 0 {
            willSet(newTotalSteps) {
                print("About to set totalSteps to \(newTotalSteps)")
            }
            didSet {
                if totalSteps > oldValue  {
                    print("Added \(totalSteps - oldValue) steps")
                }
            }
        }
    }
    +)willSet、didSetで宣言されたpropertyをパラメータとしてinout関数に渡すと、値は常に新しく上書きされるため、関数の終了時にすべてのwillSet didSetが呼び出されます.

    4. Property Wrapper ❓


    実際に格納された値と管理値の値を分離する方法の1つです.ロジックが頻繁に使用され、再利用性がある場合は、このように管理します.
  • 構造体に@PropertyWrapperキーワード定義を加える
  • で使われているところに@구조체이름のキーワードを付けます.
  • @propertyWrapper
    struct TwelveOrLess {
        private var number = 0
        // number 에 직접 접근 X, wrappedValue 를 통한 접근만 가능.
        var wrappedValue: Int {
            get { return number }
            set { number = min(newValue, 12) }
        }
    }
    
    struct SmallRectangle {
        // 가로 세로가 모두 12 이하인지 확인.
        @TwelveOrLess var height: Int
        @TwelveOrLess var width: Int
    }
    
    // 같은 역할을 하는 코드이지만 wrapping 을 이렇게 할수도 있음.
    struct SmallRectangle {
        private var _height = TwelveOrLess()
        private var _width = TwelveOrLess()
        var height: Int {
            get { return _height.wrappedValue }
            set { _height.wrappedValue = newValue }
        }
        var width: Int {
            get { return _width.wrappedValue }
            set { _width.wrappedValue = newValue }
        }
    }

    init for property wrapping


    初期文字はpropertyパッケージを使用するコードで定義および使用できます.
    @propertyWrapper
    struct SmallNumber {
        private var maximum: Int
        private var number: Int
    
        var wrappedValue: Int {
            get { return number }
            set { number = min(newValue, maximum) }
        }
    
        init() {
            maximum = 12
            number = 0
        }
        init(wrappedValue: Int) {
            maximum = 12
            number = min(wrappedValue, maximum)
        }
        init(wrappedValue: Int, maximum: Int) {
            self.maximum = maximum
            number = min(wrappedValue, maximum)
        }
    }
    
    struct ZeroRectangle {
        @SmallNumber var height: Int // init 사용
        @SmallNumber var width: Int = 1 // init(wrappedValue: ) 사용
        
        // init(wrappedValue:  maximum: ) 사용
        @SmallNumber(wrappedValue: 3, maximum: 10) var height2: Int 
        @SmallNumber(maximum: 9) var width2: Int = 2 
    }
    
    var zeroRectangle = ZeroRectangle()
    print(zeroRectangle.height, zeroRectangle.width)
    // Prints "0 0"

    投影値


    保存する値の変化を目的の値に投影して使用できます.
    @propertyWrapper
    struct SmallNumber {
        private var number: Int
        private(set) var projectedValue: Bool 
        // number 가 큰 값인지에 대한 Bool 값으로 number 를 투영.
    
        var wrappedValue: Int {
            get { return number }
            set {
                if newValue > 12 {
                    number = 12
                    projectedValue = true
                } else {
                    number = newValue
                    projectedValue = false
                }
            }
        }
    
        init() {
            self.number = 0
            self.projectedValue = false
        }
    }
    
    struct SomeStructure {
        @SmallNumber var someNumber: Int
    }
    var someStructure = SomeStructure()
    
    // $변수명 으로 투영된 변수 값에 접근할 수 있다.
    someStructure.someNumber = 4
    print(someStructure.$someNumber)
    // Prints "false"
    
    someStructure.someNumber = 55
    print(someStructure.$someNumber)
    // Prints "true"
    ->しかし、最終的には包装価値に近いはずですが、投影価値にどのように近づくか...?wrappedValue, projectedValueというキーワード自体がpropertyrappingで提供されていると思います
    ->presenterでは、外部ではsubjectをasobserverとasobserverとして使用し、重複が多いため、この構文を使用することが望ましい.

    5.全域、地域

  • グローバル:関数、メソッド、モジュール、またはタイプコンテキスト以外で定義された変数
  • 領域:関数、メソッド、モジュール、またはタイプコンテキストで定義された変数
  • .
    グローバル定数、変数は常に不活性で計算されます.

    6. Type Property ⭐️


    各インスタンスで生成されるプロファイルとは異なり、1つのタイプで作成されるプロファイルです.
    常にデフォルト値を与え、基本的にlazyで操作します.
    ストレージ/コンピューティングプロファイルとして定義可能
    定義した文の前に静的キーワードを付けます.
    struct UserInfo {
        static var uuid: String {
            return UUID().uuidString
        }
        static var name: String = "초기값"
    }
    
    print(UserInfo.uuid)
    +)enumはstructよりもよく使われています.インスタンスを作成せずに使用します.enumは初期化者がいないから!!

    n.問題


    property包装器について説明します。

  • 財産宣言、使い分けるための文法.
  • 宣言変数は
  • privateで実際の値を格納し、
  • wrappedValueでは、getter、setterを使用して変数の値を取得して設定します.
  • 投影値を使用して、変数の相関値を投影できます.
  • でよく使われるパターンに適していることが望ましい.
  • リファレンス
    https://bbiguduk.gitbook.io/swift/language-guide-1/properties