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需要是一个整数,因为一个家庭永远不可能由两个点的人组成。
所以你可能会像这样定义members
variables:
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') } } } }
现在我们可以像前面一样访问members
variables,通过inputinstanceOfFamily.members
,感谢setter函数,我们也可以像以前那样通过键入来设置它的值,例如: instanceOfFamily.members = 3
。 然而,变化的事实是,我们无法将此variables设置为小于2的任何variables。
请注意_members
variables的引入,它是存储通过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
方法存储 – 通常称为getter和setter 。
当你使用这样的属性:
var cp = myClass.perimeter
你正在调用get
代码块中包含的代码,当你像这样使用它:
myClass.perimeter = 5.0
您正在调用set
代码块中包含的代码,其中newValue
将自动填充赋值运算符右侧提供的值。
如果指定了getter和setter,则可以读写计算属性;如果只指定了getter,则可以读取计算属性。