210508 Sat

12567 ワード

学習内容


参考資料
グローバル変数問題、不良オブジェクト向けコード(メンテナンス失敗) StevenとTILの共有リンク👍
Singleton Patternはグローバル変数の使用が最も有効であると考えている
(グローバル変数の問題を効果的に解決)

1.最初の学習内容:super。init()


super.Init()継承クラスから継承されるクラスの構成を再定義(?)やりたい時.
(たとえば、次のように異なる初期値を追加したい場合)
使用と理解

Initializer Inheritance and Overriding

import Foundation

class Vehicle {
    var numberOfWheels = 0
    var description: String {
        return "\(numberOfWheels) wheel(s)"
    }
}

let vehicle = Vehicle()
print("Vehicle: \(vehicle.description)") // Vehicle: 0 wheel(s)
ストアド・プロシージャ番号OfWheelsは、0を初期値として指定します.
計算プロセス記述の初期値は指定されません.
この場合、Vehicleクラスはdefault initializerを自動的に受信し、descriptionに0を入れてインスタンスを作成します?!
class Bicycle: Vehicle {
    override init() {
        super.init()
        numberOfWheels = 2
    }
}
BicycleはVerhicleのサブクラスです
Bicycleバージョンの頭文字Lizardaは上書きを表します
Bicycleのinit()はsuperです.Init()の呼び出し時に起動
super.init()BicycleクラスのスーパークラスVerhicleを呼び出すデフォルトの初期化器
まず、VehicleはNumberOfWheelsという継承属性を初期化します.
→Bicycle NumberOfWheelsプロパティを変更する前に
今はsuperInit()を呼び出すとnumberOfWheelsの初期値は0になり、新しい値2に置き換えられます.
let bicycle = Bicycle()
print("Bicycle: \(bicycle.description)")
// Bicycle: 2 wheel(s)
Bicycleインスタンスを作成し、継承されたdescription演算プログラムを呼び出す
numberOfWheels値が0から2に更新されていることがわかります
HoverboardというVehicleを継承する別のクラスを作成
(Hover Boardは電動ホイール付きBoardですのでご注意ください)
class Hoverboard: Vehicle {
    var color: String
    init(color: String) {
        self.color = color
				// super.init() implicitly called here
    }
    override var description: String {
        return "\(super.description) in a beautiful \(color)"
    }
}

let hoverBoard = Hoverboard(color: "pink")
print("Hoverboard: \(hoverBoard.description)")
// Hoverboard: 0 wheel(s) in a beautiful pink
Hoverboardのinitializerではカラープロファイルのみを定義します
大胆なスーパー.Init()を呼び出すのではなく、暗黙的な呼び出しを提供します.
暗示的な呼び出しがoverriver varでdescriptionを定義したということですか?
とにかくこうする方法もあります!
ソース:SWIFT公式ドキュメント-初期化

2.2つ目の学習内容:static var


インスタンス価値とタイプ価値
  • インスタンスプロパティ
    インスタンスプロセスは、特定のタイプのインスタンスに属するプロセス
  • である.
    新しいタイプのインスタンスを作成するたびに、このインスタンスには独自のProperty Valueパッケージがあります(異なるインスタンスを作成すると、独自のパッケージがあります).
  • 型番組
    タイプ自体に属するpropertyをタイプpropertyと呼ぶ
    このプロシージャは、タイプのインスタンスではなくタイプに属します.
    どのようなタイプのインスタンスを作成しても
    この番組にはコピーが1つしかありません!
    Q.なぜタイプpropertyを使うのですか?
    タイプ構成は、特定のタイプのすべてのインスタンスに共通(通常使用)の値を定義するときに便利です.

    Type Property Syntax


    タイプpropertyを定義するときにstaticキーワードを使用します!
    import Foundation
    
    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
        }
    }

    Querying and Setting Type Properties


    タイプpropertyもインスタンスpropertyのようにアクセス可能
    ただし、タイプの製品はタイプに設定されています.
    タイプのインスタンスでは設定されていません.
    print(SomeStructure.storedTypeProperty) // Some value.
    SomeStructure.storedTypeProperty = "Another value"
    print(SomeStructure.storedTypeProperty) // Another value
    print(SomeEnumeration.computedTypeProperty) // 6
    print(SomeClass.computedTypeProperty) // 27
    ソース:SWIFT公式文書-属性

    3.3つ目の学習内容:override main()


    Performing the Main Task


    At a minimum, every operation object should implement at least the following methods:
  • A custom initialization method
  • main
  • Methods to override for concurrent operationsmain(Optional) This method is typically used to implement the task associated with the operation object. Although you could perform the task in the  start  method, implementing the task using this method can result in a cleaner separation of your setup and task code.
    Method overriding
    Method overriding is a language feature in which a class can provide an implementation of a method that is already provided by one of its parent classes. The implementation in this class replaces (that is, overrides) the implementation in the parent class.