什么是Swift中的“获取”和“设置”?

问题描述 投票:88回答:4

我正在学习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是什么?

swift accessor
4个回答
31
投票

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

除了存储的简单属性之外,属性还可以包含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;
}

102
投票

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

考虑一个类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现在变成了一个计算属性,这意味着它只作为一个接口来处理我们的实际变量。


16
投票

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

  • 当我们获得该物业的价值时,它会发射它的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
投票

你应该看看Computed Properties

在您的代码示例中,perimeter是一个不由类变量备份的属性,而是使用get方法计算其值并通过set方法存储 - 通常称为getter和setter。

当您使用这样的属性时:

var cp = myClass.perimeter

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

myClass.perimeter = 5.0

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

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

© www.soinside.com 2019 - 2024. All rights reserved.