Swiftの「取得」および「設定」とは何ですか?


101

私はSwiftを学習していてThe Swift Programming Language、Appleから読んでいます。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...

この部分は本には明記されておらず、それらが何のためにあるのかわかりません。

誰もが取得設定について教えてくれますか?


2
ゲッター/セッターについて21ページを読みましたか。また、最初の30ページ程度はSwiftのツアーであり、完全なドキュメントではありません。
vol7ron 2014

C ++を実行したことがある場合は、これをクラスのゲッターおよびセッターメンバー関数と相互に関連付けることができます
CodingOnSteroid

回答:


38

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

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

class EquilateralTriangle: NamedShape {
    ...

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

let someVar = myTriangle.perimeter

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

get{
    return 3.0 * self.sideLength
}

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

let someVar = 3.0 * myTriangle.sideLength

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

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;
}

108

クラス内の変数の取得と設定は、その内容の取得(「取得」)または変更(「設定」)のいずれかを指します。

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')
     }
   }
  }
}

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

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


members==> countnumberOfMembers; var members : Set<Person>??
GoZoner 14

1
set (newVal) { ... }、newValが暗示されているため、これset { _members = newVal }も正しいです。
AndreasHassing 2015

4
のような変数_membersはプライベートでなければならないことに注意してください。そうでない場合、コマンドinstanceOfFamily._members=1instanceOfFamily.members2未満の値に設定されます
Daniel

デフォルトのパラメーターはnewValueSwift 4で名前が付けられているようです– docs.swift.org/swift-book/LanguageGuide/Properties.html#ID260
Nolan Amy

18

簡単な質問の後には、短くてシンプルで明確な答えが必要です。

  • プロパティの値を取得すると、そのget{}部分が起動されます。

  • プロパティに値を設定すると、そのset{}部分が起動されます。

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

例:

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

1
クラスの外部からアクセスするメンバーにデフォルト値を割り当てることは必須ですか?クラスUserBean:NSObject {var user_id:String?= nil}次のようにアクセスしますlet user:UserBean = UserBean()user.user_id = "23232332"
Amr Angry

1

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

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

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

var cp = myClass.perimeter

あなたはgetコードブロックに含まれるコードを呼び出しており、それを次のように使用すると:

myClass.perimeter = 5.0

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

ゲッターとセッターの両方が指定されている場合、計算されたプロパティは読み書き可能です。ゲッターのみが指定されている場合は、読み取り専用です。


0

変数はクラスでこのように宣言して呼び出します

class X {
    var x: Int = 3

}
var y = X()
print("value of x is: ", y.x)

//value of x is:  3

ここで、xのデフォルト値を3以上にするようにプログラムする必要があります。ここで、xが3未満の場合に架空のケースを考えてみましょう。プログラムは失敗します。だから、あなたは人々に3つ以上の3つを置くことを望みます。Swiftはあなたのために簡単になりました、そして彼らはiOS開発で広く使われるので、変数値をデートするこのビットアドバンスの方法を理解することが重要です。ここで、getとsetがどのように使用されるかを見てみましょう。

class X {
    var _x: Int = 3
    var x: Int {
        get {
            return _x
        }
        set(newVal) {  //set always take 1 argument
            if newVal >= 3 {
             _x = newVal //updating _x with the input value by the user
            print("new value is: ", _x)
            }
            else {
                print("error must be greater than 3")
            }
        }
    }
}
let y = X()
y.x = 1
print(y.x) //error must be greater than 3
y.x = 8 // //new value is: 8

それでも疑問がある場合は、覚えておいてください。getおよびsetの使用は、変数を更新する方法で変数を更新することです。getおよびsetは、ロジックを支配するためのより良い制御を提供します。強力なツールなので、簡単には理解できません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.