Swift-プロパティ

4393 ワード

プロパティは、特定のクラス、構造、または列挙の値を記述するために使用されます.Swiftでは,属性は記憶属性,計算属性,クラス属性の3種類に分けられる.1.記憶属性記憶属性は、特定のクラスを記憶する定数または変数である.定数格納のプロパティは「let」キー定義、変数格納のプロパティは「var」キー定義を使用します.
struct PersonInfo {
    let name:String
    var age:Int
}
var person = PersonInfo(name: "  ", age: 18)
//   person name  
print(person.name)
//    var                
person.age = 20

構造体の時間値タイプのため、構造インスタンスpersonを作成し、定数(let)に割り当てると、この構造の属性が変数属性であっても変更できません.値タイプインスタンスが定数2として存在する場合、そのすべてのプロパティも定数として存在します.このプロパティは、クラスが参照タイプであるため、クラスには適用されません.参照タイプのインスタンスを定数に割り当てると、インスタンスの変数プロパティを変更できます.
クラスのインスタンスは定数に割り当てられ、インスタンスの変数属性を変更できます.
2.怠け者ストレージ属性怠け者ストレージとは、私たちが言った怠け者ロードであり、最初に呼び出されたときにその初期値を計算する属性であり、属性宣言の前にlazyを加えればよい.プロパティの初期値が外部の理由でインスタンスの初期化が完了する前に決定できない場合、またはプロパティの初期値が複雑で大量の計算を必要とする場合、怠け者のストレージプロパティを使用できます.インスタンス構築が完了するまでプロパティの値が得られない可能性があるため、怠け者のストレージプロパティを変数として宣言する必要があります.定数プロパティは、コンストラクションプロセスが完了する前に初期値が必要であるため、怠惰なストレージプロパティとして宣言できません.
3.計算属性計算属性は、値を格納するのではなく、getterとsetterを提供して、他の属性の値をそれぞれ取得して設定します.
class Person {
    var length:Int = 10
    var age:Int {
        get {
            return length * 2
        }
        set {
            length = newValue / 2
        }
    }
    //       
    var height:Int{
        get {
            return length * 4
        }
    }
    //          get
    var height2:Int{
        return length * 4
    }
}

var person = Person()
person.height

計算プロパティはvarキーワード定義を使用する必要があります.読み取り専用計算プロパティを含む必要があります.彼らの値は固定されていないため、letキーワードは定数記憶のプロパティのみを宣言するために使用され、初期化後も変更できない値です.
4.属性オブザーバ属性オブザーバは、初期化された属性値の変化を監視し、応答することができ、属性の値が変化した場合、事前に書かれたコードを呼び出して追加の操作を実行し、応答することができる.プロパティ・オブジェクトのいくつかの特徴:(1)プロパティにオブジェクトを追加するには、プロパティ・タイプを明確に宣言する必要があります.そうしないと、コンパイラがエラーを報告します.(2)willSetはnewNameのパラメータを持つことができます.なければ、このパラメータのデフォルト名はnewValueです.(3)didSetは、古い属性を表すoldNameのパラメータを持つことができ、持たない場合はデフォルトでoldValueと命名されます.(4)属性初期化時にwillSetとdidSetは呼び出されない.初期化コンテキストの外でのみ、プロパティ値を設定すると呼び出されます.また,didSetの実装内で属性に値を付与しても,属性を再び呼び出すことはない.(5)設定した値が元の値と同じであってもwillSetとdidSetが呼び出される.
class Person {
    var name:String?
    var age:Int = 10 {
        //  age            
        willSet {
            print("         \(newValue)")
        }
        //  age        ,    name    
        didSet {
            if age < 10 {
                name = "lucy"
            } else {
                name = "lily"
            }
            print("\(name)    \(oldValue)  \(age)")
        }
    }
}
let person = Person()
person.age = 5
person.age = 20

実行結果
didSetオブジェクトでアトリビュートに値を割り当てると、この値はオブジェクトの前に設定した値に置き換えられます.
5.タイプ属性は、学生クラスを仮定し、3つの属性があり、生活費、学費、氏名があり、その中で生活費と氏名は学生の実例ごとに異なることができるが、学費属性は学生にとって同じであり、学費は個人に関係なく、実例化を必要とせずに使用することができ、この属性はクラス属性と呼ぶことができる.staticキーワードを使用して定義します.構造体、列挙、クラスはタイプ属性を定義できます.次に、構造体の属性の例をいくつか書きます.
struct Student {
    var livingConst:Double = 0.0
    var owner:String = ""
    static var tuition:Double = 4500
    static var tuitionProp:Double {
        return tuition + 100
    }
    var totalCost:Double {
        return Student.tuition + livingConst
    }
}

//       
print(Student.tuitionProp)
var aStudent = Student()
//       
aStudent.livingConst = 1_000
//       
print(aStudent.totalCost)

列挙タイプのプロパティ:
enum Student {
    case Java
    case PHP
    case iOS
    static var tuition:Double = 4500
    static var tuitionProp:Double {
        return tuition + 100
    }
    var instanceProp:Double {
        switch self {
        case Java:
            Student.tuition = 15000
        case PHP :
            Student.tuition = 16000
        default:
            Student.tuition = 17000
        }
        return Student.tuition + 1_000
    }
    
}
//       
print(Student.tuitionProp)
var aStudent = Student.iOS
//       
print(aStudent.instanceProp)

クラスタイプのプロパティ:
class Student {
    var livingConst:Double = 0.0
    var name:String = ""
    static var tuition:Double = 4500
    static var tuitionProp:Double {
        return tuition
    }
    var totalCost:Double {
        return Student.tuition + livingConst
    }
}

//       
print(Student.tuitionProp)
var aStudent = Student()
//       
aStudent.livingConst = 1_000
//       
print(aStudent.totalCost)

インスタンスのストレージ属性とは異なり、タイプのストレージ属性はデフォルト値を指定する必要があります.タイプ自体が再初期化中にコンストラクタを使用してタイプ属性に値を割り当てることができないため