私は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とは何か説明できますか?
それは実際にコードの直前で説明されています:
格納される単純なプロパティに加えて、プロパティにはゲッターとセッターを含めることができます。
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;
}
クラス内の変数の取得と設定は、そのコンテンツの取得(「取得」)または変更(「設定」)を指します。
クラス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
は計算されたプロパティになりました。つまり、実際の変数を処理するインターフェイスとしてのみ機能します。
簡単な質問の後に、短く、シンプルで明確な回答を続ける必要があります。
プロパティの値を取得すると、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
計算されたプロパティ を見てください
コードサンプルでは、perimeter
はクラス変数によってバックアップされないプロパティであり、代わりにその値はget
メソッドを使用して計算され、set
メソッドを介して保存されます。通常、getterおよびsetter。
このプロパティを次のように使用すると:
var cp = myClass.perimeter
get
コードブロックに含まれるコードを呼び出しており、次のように使用する場合:
myClass.perimeter = 5.0
set
コードブロックに含まれるコードを呼び出しています。ここで、newValue
には、代入演算子の右側に指定された値が自動的に入力されます。
計算されたプロパティは、getterとsetterの両方が指定されている場合はreadwrite、getterのみが指定されている場合はreadonlyになります。