Day 10プロパティ(Properties)、メソッド(Methods)

6559 ワード

このページには、•ストレージ・プロパティ・コンピューティング・プロパティ・プロパティ・オブジェクト・タイプ・プロパティが含まれています.
    >•  
    •  

一:属性####


1、ストレージ属性は簡単に言えば、1つのストレージ属性は特定のクラスまたは構造体インスタンスに格納された定数または変数である.ストレージ属性は、変数ストレージ属性(キーワードvarで定義)でも定数ストレージ属性(キーワードletで定義)でもよい.ストレージ属性を定義するときにデフォルト値を指定できます.
    //  FixedLengthRange  , , .
    struct FixedLengthRange {
        var firstValue : Int
        let length : Int
    }
    var  rangeOfThreeItems = FixedLengthRange.init(firstValue: 0, length: 3)
    //  0,1,2
    rangeOfThreeItems.firstValue = 6
    //  6,7,8
  • 定数構造体の記憶属性
  • //構造体のインスタンスを作成して定数に値を割り当てると、そのインスタンスのプロパティは変更できません.変数として宣言されたプロパティがあっても、変更できません.
        let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
        //  0,1,2,3
      rangeOfFourItems.firstValue = 6
        //   firstValue  , 
    

    この挙動は構造体(struct)が値タイプに属するためである.値タイプのインスタンスが定数として宣言されると、そのすべてのプロパティが定数になります.参照タイプに属するクラス(class)は異なります.参照タイプのインスタンスを定数に割り当てると、インスタンスの変数プロパティを変更できます.
  • 遅延記憶属性遅延記憶属性とは、最初に呼び出されたときにその初期値が計算される属性を指す.プロパティ宣言の前にlazyを使用して、遅延ストレージプロパティを表示します.

  • 注意:遅延ストレージ属性は、インスタンス構築が完了してから取得される可能性があるため、varキーを使用する変数として宣言する必要があります.定数属性は、構築プロセスが完了する前に初期値が必要であるため、遅延属性として宣言できません.
    次の例では、複雑なクラスで不要な初期化を回避するために、遅延ストレージ属性を使用します.例では、DataImporterとDataManagerの2つのクラスを定義します.次のコードの一部を示します.
        class DataImporter {
            /*
             DataImporter  。  。
             */
            var fileName = "data.txt"
            //  
        }
        
        class DataManger {
            lazy var importer = DataImporter()
            var data = [String]()
        }
        let manager = DataManger()
        manager.data.append("Some data")
        manager.data.append("Some more data")
        // DataImporter   importer  
    

    lazyが使用されているため、importerプロパティは最初にアクセスされたときにのみ作成されます.たとえば、プロパティfile Nameにアクセスする場合:
        print(manager.importer.fileName)
        // DataImporter   importer  
        //   "data.txt”
    

    2、計算属性
        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: Point {
                get {
                    let centerX = origin.x + (size.width / 2)
                    let centerY = origin.y + (size.height / 2)
                    return Point(x: centerX, y: centerY)
                }
                set(newCenter) {
                    origin.x = newCenter.x - (size.width / 2)
                    origin.y = newCenter.y - (size.height / 2)
                }
            } }
        var square = Rect(origin: Point(x: 0.0, y: 0.0),size: Size(width: 10.0, height: 10.0))
        let initialSquareCenter = square.center
        square.center = Point(x: 15.0, y: 15.0)
        print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
        //   "square.origin is now at (10.0, 10.0)”
    
  • 読取り専用計算属性
  • getterにsetterがない計算属性だけが読み取り専用計算属性です.読み取り専用計算プロパティは、ポイント演算子でアクセスできる値を常に返しますが、新しい値を設定することはできません.読み取り専用計算プロパティの宣言では、getキーとカッコを削除できます.
    struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
    return width * height * depth
    }
    }
    let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
    print("the volume of fourByFiveByTwo is (fourByFiveByTwo.volume)")

    **3、属性オブザーバ**•新しい値が設定される前に呼び出す•新しい値が設定された直後に呼び出す
        class SomeClass {
            static var storedTypeProperty = "Some value."
            static var computedTypeProperty: Int {
                return 27 }
            class var overrideableComputedTypeProperty: Int {
                return 107
            }
    

    **4、タイプ属性構文**キーワードstaticを使用してタイプ属性を定義します.クラスに計算型タイプ属性を定義する場合は、キーワードclassを変更して親クラスの実装の書き換えをサポートできます.次の例では、ストレージタイプと計算タイプのプロパティの構文を示します.
            struct SomeStructure {
                static var storedTypeProperty = "Some value."
                static var computedTypeProperty: Int {
                    return 1
                }
            }
            
            enum SomeEnumeration {
                static var storedTypeProperty = "Some value."
                static var computedTypeProperty: Int {
                    return 6
                }
            }
            
            class SomeClass {
                static var storedTypeProperty = "Some value."
                static var computedTypeProperty: Int {
                    return 27
                }
                class var overrideableComputedTypeProperty: Int {
                    return 107
                }
            }
    

    二:方法(Methods)####


    メソッドは、特定のタイプに関連付けられた関数です.クラス、構造体、列挙はインスタンスメソッドを定義することができます.インスタンスメソッドは、特定のタイプのインスタンスに特定のタスクと機能をカプセル化します.クラス、構造体、列挙はタイプメソッドを定義することもできます.タイプメソッドは、タイプ自体に関連付けられます.
    タイプメソッドはObjective-Cのクラスメソッド(class methods)と似ています.構造体と列挙が定義できる方法は、SwiftとC/Objective-Cの主な違いの一つである.Objective-Cでは、クラスはメソッドを定義できる唯一のタイプです.しかし、Swiftでは、クラス/構造体/列挙を定義するかどうかを選択するだけでなく、作成したタイプ(クラス/構造体/列挙)で方法を柔軟に定義することができます.
    **1、インスタンスメソッド(Instance Methods)(-メソッド)**インスタンスメソッドは、特定のクラス、構造体、または列挙タイプのインスタンスに属するメソッドです.インスタンス・メソッドは、インスタンスのプロパティにアクセスおよび変更する方法またはインスタンスの目的に関連する機能を提供し、インスタンスの機能をサポートします.
    インスタンスメソッドは、その属するタイプの前後のカッコの間に書きます.インスタンス・メソッドは、その属するタイプの他のすべてのインスタンス・メソッドおよびプロパティに暗黙的にアクセスできます.インスタンスメソッドは、その属するクラスの特定のインスタンスによってのみ呼び出されます.インスタンスメソッドは、既存のインスタンスから離れて呼び出されません.次の例では、動作の発生回数をカウントするために使用できる簡単なCounterクラスを定義します.
        class Counter {
            var count = 0
            func increment () {
                count += 1
            }
            func increment(by amount: Int) {
                count += amount
            }
            
            func reset() {
                count = 0
            }
        }
        //  Counter  :
        //   - increment  ;
        //   - increment(by: Int)    ;
        //   - reset  0。
        
        let counter = Counter ()
        print(counter.count)
        // 0
        counter.increment()
        print(counter.count)
        // 1
        counter.increment(by: 5)
        print(counter.count)
        // 6
        counter.reset()
        // 0
        print(counter.count)
    

    **2、タイプメソッド(+メソッド)**インスタンスメソッドは、あるタイプのインスタンスによって呼び出されるメソッドです.タイプ自体で呼び出されるメソッドを定義することもできます.このメソッドをタイプメソッドと呼びます.メソッドのfuncキーワードの前にキーワードstaticを付けてタイプメソッドを指定します.クラスはまた、キーワードclassを使用して、サブクラスが親クラスを書き換える方法を実装することもできます.
        class SomeClasses {
            class func someTypeMethod () {
                // 
                
            }
            
            static func testMethod () -> String {
                return "testMethod"
            }
        }
        // 
        SomeClasses.someTypeMethod()
        let msg = SomeClasses.testMethod()
        print(msg)