我正在学习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...
这部分未在书中指定,我无法得到它们的用途。
谁能解释一下get和set是什么?
这实际上是在代码之前解释的:
除了存储的简单属性之外,属性还可以包含getter和setter。
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;
}
在类中获取和设置变量是指检索(“获取”)或更改(“设置”)其内容。
考虑一个类members
的变量family
。当然,这个变量需要是一个整数,因为一个家族永远不能由两个人组成。
所以你可能会像这样定义members
变量:
class family {
var members:Int
}
然而,这将使使用该类的人有可能将家庭成员的数量设置为0或1。并且因为不存在1或0的家庭,所以这是非常不幸的。
这就是getter和setter的用武之地。通过这种方式,您可以自己决定如何更改变量以及可以接收哪些值,以及决定返回哪些内容。
回到我们的家庭班,让我们确保没有人可以将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
setter函数设置的值的实际变量。原来的members
现在变成了一个计算属性,这意味着它只作为一个接口来处理我们的实际变量。
一个简单的问题应该是一个简短而简单明了的答案。
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
你应该看看Computed Properties
在您的代码示例中,perimeter
是一个不由类变量备份的属性,而是使用get
方法计算其值并通过set
方法存储 - 通常称为getter和setter。
当您使用这样的属性时:
var cp = myClass.perimeter
你正在调用get
代码块中包含的代码,当你像这样使用它时:
myClass.perimeter = 5.0
您正在调用set
代码块中包含的代码,其中newValue
将自动填充赋值运算符右侧提供的值。
如果指定了getter和setter,则可以读取计算属性,如果仅指定了getter,则可以读取。