1. はじめに
属性は、値をクラス、構造体、および列挙に関連付けます。 Swift のプロパティは、保存されたプロパティと計算されたプロパティの 2 つのタイプに分類されます。 保存されたプロパティは値を保存するために使用され、クラスと構造体にのみ使用できます。列挙。
2. ストレージ属性
ストレージ属性を宣言する場合、変数または定数を使用して、その属性のデフォルト値を設定することも、構築例で値を設定することもできます。構文を使用して構造体にアクセスするには、構造体の保存された属性のサンプル コードは次のとおりです。
struct MyStruct { var property1 = 1 var property2:Int } var obj = MyStruct(property1: 1, property2: 2) //通过点语法进行属性的访问 print(obj.property1,obj.property2)
上記の構造体の場合、いずれかの属性が let 定数として宣言されている場合、この属性は変更することはできません。もう 1 つ注意すべき点は、構造体のインスタンスを作成するときに let を使用する場合、構造体のプロパティは変数であっても変更できないことです。これは授業とは大きく異なります。
遅延ストレージ属性と呼ばれるタイプのストレージ属性もあり、クラスの一部の属性がクラスのインスタンスごとに使用されず、一部の属性の構築に多くの時間がかかる状況が想像できます。現時点でのより賢明な設計は、クラスのインスタンスがこの属性を使用するときにこのタイプの属性が構築されないことです。このような属性は、遅延を使用して宣言されます。例は次のとおりです:
//第一个类 class MyClass1 { init(){ print("MyClass1类被构造") } } class MyClass2 { //声明为延时存储属性 lazy var body = MyClass1() } //在构造MyClass2时 并不会进行body属性的构造 不会有打印信息 var obj2 = MyClass2() //执行下面代码后 会有打印信息 使用body属性使得body被构造 obj2.body
遅延構築属性が複数のスレッドで使用される場合、それが 1 回だけ構築されるという保証はないことに注意してください。
3. 計算されたプロパティ
簡単に理解すると、計算されたプロパティは、値を保存するために使用される独立したプロパティではなく、主に計算を通じて他のプロパティを取得または設定するために使用されるということです。属性の値。例は次のとおりです。
struct Circle { //圆心 var center:(Double,Double) //半径 var r:Double //周长 将其作为计算属性 var l:Double{ get{ //计算圆的周长 return 2.0*r*M_PI } set{ //通过周长重新计算半径 默认传入的参数名为newValue r = newValue/(M_PI*2) } } } var circle = Circle(center: (0,0), r: 2) print(circle.l) circle.l=24 print(circle.r)
上記のデモ コードから、l 属性は r 属性を通じて l を計算するか、l を使用して r を推論するだけであることがわかります。注意すべき点は、set と get の 2 つのコード ブロックを計算属性で作成できることです。set コード ブロックはオプションであり、get コード ブロックには外部から渡されたデータを渡すためにデフォルトで newValue パラメーターが生成されます。もちろん、コード ブロックを取得するだけで実装することもできます。その場合、このプロパティは読み取り専用の計算プロパティとなり、取得のみ可能で設定はできません。もう 1 つ注意すべき点は、開発者は設定コード ブロックの後にパラメータ名をカスタマイズして、外部から渡されるパラメータを受け取ることもできることです。例は次のとおりです。
struct Circle { //圆心 var center:(Double,Double) //半径 var r:Double //周长 将其作为计算属性 var l:Double{ get{ //计算圆的周长 return 2.0*r*M_PI } set(newL){ //通过周长重新计算半径 默认传入的参数名为newValue r = newL/(M_PI*2) } } }
読み取り専用の計算プロパティはさらに短縮できます。 set コード ブロックがないため、キーワード get と括弧はあいまいさを生じずに省略できます。例は次のとおりです。メソッドと Objective-C の get メソッドと set メソッドは、実際には同じものではありません。Objective-C では、プロパティを取得または設定するときに開発者がカスタマイズされた操作を実行できるようにする set メソッドと get メソッドを提供します。プロパティ リスナーを通じて Swift に実装されます。
属性リスナーにはwillSetとdidSetの2種類があり、willSetは属性値が変更されそうなときに実行され、didSetは属性値が変更されたときに実行され、変更前後の値が渡されます。 。例は次のとおりです。
struct Point { var x:Double var y:Double var center:(Double,Double){ return (x/2,y/2) } }
willSet はデフォルトで newValue という名前のパラメータを生成し、didSet はデフォルトで oldValue という名前のパラメータを生成します。これらのパラメータの名前をカスタマイズすることもできます。
struct Point { var x:Double var y:Double{ willSet{ print("将要进行值的更新设置,新的值是:",newValue) } didSet{ print("已经进行值得更新设置,旧的值是:",oldValue) } } var center:(Double,Double){ return (x/2,y/2) } } var point = Point(x: 3, y: 3) //将打印 /* 将要进行值的更新设置,新的值是: 4.0 已经进行值得更新设置,旧的值是: 3.0 */ point.y=4
インスタンス属性は型のインスタンスに向けられ、型属性は型に直接向けられます。型のペアがインスタンス化されるたびに、そのインスタンスはインスタンス プロパティの独立したセットを持ち、Objective-C では、通常、この効果を実現するためにグローバル プロパティが使用されます。型属性を宣言するには、static キーワードを使用します。例は次のとおりです。
struct Point { var x:Double var y:Double{ willSet(new){ print("将要进行值的更新设置,新的值是:",new) } didSet(old){ print("已经进行值得更新设置,旧的值是:",old) } } var center:(Double,Double){ return (x/2,y/2) } }
クラスの型計算属性には、継承と書き換えが必要な場合、static が必要であることに注意してください。 be キーワードを class キーワードに置き換えます。例は次のとおりです:
struct Point { //类型存储属性 static var name:String = "Point" //类型计算属性 static var subName:String{ return "sub"+name } var x:Double var y:Double{ willSet(new){ print("将要进行值的更新设置,新的值是:",new) } didSet(old){ print("已经进行值得更新设置,旧的值是:",old) } } var center:(Double,Double){ return (x/2,y/2) } } //类型属性 通过类型点语法来获取 print(Point.name,Point.subName)