首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Swift中'get‘和'set’是什么?

在Swift中'get‘和'set’是什么?
EN

Stack Overflow用户
提问于 2014-07-11 21:48:43
回答 4查看 162.9K关注 0票数 112

我正在学习Swift,我正在阅读Apple的Swift编程语言。我没有任何Objective-C背景(只有PHP、JavaScript和其他,但没有Objective-C)。

在第24-25页上,我看到了以下代码:

代码语言:javascript
复制
//...Class definition stuff...

var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
}

//...Class continues...

这部分在书中没有指定,我不知道它们是用来做什么的。

什么是getset

EN

回答 4

Stack Overflow用户

发布于 2014-07-11 22:13:56

类中变量的获取和设置指的是检索(“获取”)或修改(“设置”)它们的内容。

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

因此,您可能会像这样定义members变量:

代码语言:javascript
复制
class family {
  var members:Int
}

然而,这将使使用这个类的人有可能将家庭成员的数量设置为类似于0或1的东西。由于不存在1或0的家庭,这是相当不幸的。

这就是getter和setter的用武之地。这样,您就可以自己决定如何更改变量以及它们可以接收什么值,以及决定它们返回的内容。

返回到我们的家庭类,让我们确保没有人可以将members值设置为小于2的任何值:

代码语言:javascript
复制
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')
      }
    }
  }
}

现在,我们可以像以前一样通过输入instanceOfFamily.members来访问members变量,并且通过setter函数,我们还可以像以前一样设置它的值,例如通过输入:instanceOfFamily.members = 3。然而,改变的是,我们不能再将此变量设置为小于2的值。

注意引入了_members变量,它是存储我们通过members设置器函数设置的值的实际变量。最初的members现在已经成为一个计算属性,这意味着它只作为一个接口来处理我们的实际变量。

票数 116
EN

Stack Overflow用户

发布于 2015-11-16 10:16:00

一个简单的问题后面应该有一个简短、简单和清晰的答案。

  • 当我们获取属性的值时,它会触发它的get{}部件。

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

PS。当为属性设置值时,Swift会自动创建一个常量"newValue“=我们正在设置的值。在属性的set{}部分中可以访问常量"newValue“之后。

示例:

代码语言:javascript
复制
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
票数 27
EN

Stack Overflow用户

发布于 2014-07-11 22:01:41

你应该看看Computed Properties

在您的代码示例中,perimeter是一个未由类变量支持的属性。相反,它的值是使用get方法计算的,并通过set方法存储--通常称为getter和setter。

当您像这样使用该属性时:

代码语言:javascript
复制
var cp = myClass.perimeter

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

代码语言:javascript
复制
myClass.perimeter = 5.0

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

如果同时指定了getter和setter,则计算属性可以是读/写的;如果仅指定了getter,则计算属性可以是只读的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24699327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档