web-dev-qa-db-ja.com

Swiftの「get」および「set」とは何ですか?

私はSwiftを学んでおり、AppleからThe Swift Programming Languageを読んでいます。ObjectiveCのバックグラウンドはありません(PHP、JS、その他のみでObj Cはありません)

24-25ページに、次のコードが表示されます。

//...Class definition stuff...

var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
}

//...Class continues...

この部分は本で指定されていないため、それらが何のためにあるのかわかりません。

getおよびsetとは何か説明できますか?

89
Mr.Web

それは実際にコードの直前で説明されています:

格納される単純なプロパティに加えて、プロパティにはゲッターとセッターを含めることができます。

class EquilateralTriangle: NamedShape {
    ...

他のクラスがその境界変数を取得したい場合、次のようにします。

let someVar = myTriangle.perimeter

...これはこれを呼び出します:

get{
    return 3.0 * self.sideLength
}

したがって、呼び出し元のコントローラーがこれを実行した場合と本質的に同じです。

let someVar = 3.0 * myTriangle.sideLength

別のオブジェクトの変数をsetすると、次のようになります。

myTriangle.perimeter = 100

set{}ブロック内のコードを呼び出します:

set {
    sideLength = newValue / 3.0
}

それで、変数を設定しているクラスがこれを行ったかのようです。

myTriangle.sideLength = 100/3.0

本当に便利です-変数を設定する直前と変数を取得する直前に行われるため、常に3で割ったり乗算したりすることなく、他のコードからこれを呼び出すことができます。

Swiftでは、取得時に計算され、設定時に何かを実行できるプロパティを持つことができます。 Objective-Cでもこれを実行できます。

// .h
@property (nonatomic) double perimeter;

//.m

- (double)perimeter
{
    return self.sideLength * 3.0;
}
- (void)setPerimeter:(double)perimeter
{
    self.perimeter = perimeter; // In Swift, this is done automatically.
    self.sideLength = perimeter / 3.0;
}
31
Undo

クラス内の変数の取得と設定は、そのコンテンツの取得(「取得」)または変更(「設定」)を指します。

クラスmembersの変数familyを考えます。当然のことながら、この変数は整数である必要があります。これは、家族が人を指す2つのポイントで構成されることはないためです。

したがって、おそらくmembers変数を次のように定義して先に進むでしょう。

class family {
   var members:Int
}

ただし、これにより、このクラスを使用するユーザーは、家族の数を0または1に設定できるようになります。また、1または0の家族などは存在しないため、これは非常に残念です。

これがゲッターとセッターの出番です。この方法で、変数をどのように変更し、どの値を受け取ることができるかを決定し、返されるコンテンツを決定できます。

ファミリークラスに戻って、誰もmembersの値を2未満に設定できないことを確認しましょう。

class family {
  var _members:Int = 2
  var members:Int {
   get {
     return _members
   }
   set (newVal) {
     if newVal >= 2 {
       _members = newVal
     } else {
       println('error: cannot have family with less than 2 members')
     }
   }
  }
}

これで、instanceOfFamily.membersを入力して、以前と同じようにmembers変数にアクセスできます。setter関数のおかげで、たとえばinstanceOfFamily.members = 3と入力して、以前と同じように値を設定できます。ただし、変更されたのは、この変数を2より小さい値に設定できないという事実です。

_members変数の導入に注意してください。これは、members setter関数を介して設定した値を格納する実際の変数です。元のmembersは計算されたプロパティになりました。つまり、実際の変数を処理するインターフェイスとしてのみ機能します。

102
Markus Buhl

簡単な質問の後に、短く、シンプルで明確な回答を続ける必要があります。

  • プロパティの値を取得すると、get{}部分が発生します。

  • プロパティに値を設定すると、set{}部分が発生します。

PS。プロパティに値を設定すると、Swiftは「newValue」という名前の定数=設定する値を自動的に作成します。定数「newValue」がプロパティのset{}部分でアクセス可能になった後。

例:

var A:Int = 0
var B:Int = 0

var C:Int {
get {return 1}
set {print("Recived new value", newValue, " and stored into 'B' ")
     B = newValue
     }
}

//When we are getting a value of C it fires get{} part of C property
A = C 
A            //Now A = 1

//When we are setting a value to C it fires set{} part of C property
C = 2
B            //Now B = 2
15
Maxim

計算されたプロパティ を見てください

コードサンプルでは、​​perimeterはクラス変数によってバックアップされないプロパティであり、代わりにその値はgetメソッドを使用して計算され、setメソッドを介して保存されます。通常、getterおよびsetter

このプロパティを次のように使用すると:

var cp = myClass.perimeter

getコードブロックに含まれるコードを呼び出しており、次のように使用する場合:

myClass.perimeter = 5.0

setコードブロックに含まれるコードを呼び出しています。ここで、newValueには、代入演算子の右側に指定された値が自動的に入力されます。

計算されたプロパティは、getterとsetterの両方が指定されている場合はreadwrite、getterのみが指定されている場合はreadonlyになります。

1
Antonio