Swift是什么“get”和“set”?

我正在学习Swift,我正在阅读从Apple The Swift Programming Language ,我没有Objective C背景(只有PHP,JS和其他,但没有Obj C)

在第24-25页我看到这个代码:

 //...Class definition stuff... var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } //...Class continues... 

这部分没有在书中指定,我不明白这是什么。

任何人都可以解释我得到设置是什么?

这实际上是在代码之前解释的:

除了存储的简单属性之外,属性还可以有一个getter和一个setter。

 class EquilateralTriangle: NamedShape { ... 

当其他一些class级想要获得这个外围variables时,他们这样做:

 let someVar = myTriangle.perimeter 

…这就是这样调用的:

 get{ return 3.0 * self.sideLength } 

因此,如果呼叫控制器这样做,本质上是这样的:

 let someVar = 3.0 * myTriangle.sideLength 

当你从另一个对象设置variables,它看起来像这样:

 myTriangle.perimeter = 100 

其中调用set{}块中的代码:

 set { sideLength = newValue / 3.0 } 

所以就好像设置variables的类已经这样做了:

 myTriangle.sideLength = 100/3.0 

这只是为了方便起见 – 您可以从其他代码中调用此函数,而不必一直划分或乘以3,因为在设置variables之前就已经完成了这个工作。

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

类中variables的获取和设置指的是检索(“获取”)或改变(“设置”)其内容。

考虑一个类family的variablesmembers 。 当然,这个variables需要是一个整数,因为一个家庭永远不可能由两个点的人组成。

所以你可能会像这样定义membersvariables:

 class family { var members:Int } 

然而,这样可以让人们用这个class级把家庭成员的数目设定为0或1,而且由于没有1或0的家庭,所以这是相当不幸的。

这就是获取者和制定者进来的地方。这样,你可以自己决定如何改变variables以及他们可以接受什么样的价值,以及决定他们返回什么样的内容。

回到我们的家庭课堂,让我们确保没有人可以将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') } } } } 

现在我们可以像前面一样访问membersvariables,通过inputinstanceOfFamily.members ,感谢setter函数,我们也可以像以前那样通过键入来设置它的值,例如: instanceOfFamily.members = 3 。 然而,变化的事实是,我们无法将此variables设置为小于2的任何variables。

请注意_membersvariables的引入,它是存储通过members setter函数设置的值的实际variables。 原来的members现在已经成为一个计算的属性,这意味着它只是作为一个接口来处理我们的实际variables。

一个简单的问题应该是一个简短的,简单明了的答案。

  • 当我们获得财产的价值时,它激发它的get{}部分。

  • 当我们为属性设置一个值时,它会触发它的set{}部分。

PS。 当为该属性设置一个值时,SWIFT会自动创build一个名为“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 = CA //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是一个没有由类variables备份的属性,而是使用get方法计算值,并通过set方法存储 – 通常称为gettersetter

当你使用这样的属性:

 var cp = myClass.perimeter 

你正在调用get代码块中包含的代码,当你像这样使用它:

 myClass.perimeter = 5.0 

您正在调用set代码块中包含的代码,其中newValue将自动填充赋值运算符右侧提供的值。

如果指定了getter和setter,则可以读写计算属性;如果只指定了getter,则可以读取计算属性。