当前位置: 首页 > 知识库问答 >
问题:

属性获取器和 setters

慕永年
2023-03-14

通过这个简单的类,我得到了编译器警告

尝试在其自己的 setter/getter 中修改/访问 x

当我这样使用它时:

var p: point = Point()
p.x = 12

我得到一个EXC坏访问。如果没有明确的支持ivars,我该如何做呢?

class Point {

    var x: Int {
        set {
            x = newValue * 2 //Error
        }
        get {
            return x / 2 //Error
        }
    }
    // ...
}

共有3个答案

童化
2023-03-14

Swift中的setter/getter与ObjC有很大不同。该属性成为一个计算属性,这意味着它没有像ObjC中那样的支持变量,如< code>_x。

在下面的解决方案代码中,您可以看到xTimesTwo不存储任何内容,而只是根据x,计算结果。

请参阅有关计算属性的官方文档。

您想要的功能也可能是属性观察者。

您需要的是:

var x: Int

var xTimesTwo: Int {
    set {
       x = newValue / 2
    }
    get {
        return x * 2
    }
}

您可以在setter/getter中修改其他属性,这就是它们的用途。

云胤
2023-03-14

您可以使用属性观察器自定义设置值。为此,请使用“didSet”而不是“set”。

class Point {

var x: Int {
    didSet {
        x = x * 2
    }
}
...

至于格特...

class Point {

var doubleX: Int {
    get {
        return x / 2
    }
}
...
段干俊茂
2023-03-14

Setters和Getters适用于< code > computed properties ;这种属性在实例中没有存储空间getter的值是从其他实例属性中计算出来的。在您的情况下,没有要分配的< code>x。

显式:“没有显式支持ivars我怎么能做到这一点”。你不能-你需要一些东西来备份计算的属性。试试这个:

class Point {
  private var _x: Int = 0             // _x -> backingX
  var x: Int {
    set { _x = 2 * newValue }
    get { return _x / 2 }
  }
}

具体而言,在Swift REPL中:

 15> var pt = Point()
pt: Point = {
  _x = 0
}
 16> pt.x = 10
 17> pt
$R3: Point = {
  _x = 20
}
 18> pt.x
$R4: Int = 10
 类似资料:
  • 主要内容:Jsoup 获取属性 语法,Jsoup 获取属性 说明,Jsoup 获取属性 示例以下示例将展示在将 HTML 字符串解析为 Document 对象后获取 dom 元素属性的方法的使用。 Jsoup 获取属性 语法 document : 文档对象代表 HTML DOM。 Jsoup : 解析给定 HTML 字符串的主类。 html : HTML 字符串。 link : 元素对象表示表示锚标记的 html 节点元素。 link.attr() : attr(attribute) 方

  • 接口说明 获取shp属性 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /wish3dearth/api/material/shp/v1.0.0/getShpAttributeByMaterilId 是否需要登录 否 请求字段说明 参数 类型 请求类型 是否必须 说明 materialId string query 是 素材ID 响

  • 接口说明 获取shp属性 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /wish3dearth/api/material/shp/v1.

  • 问题内容: 这个问题很简单,但是由于我是python的新手,所以我从php过来了,因此遇到了一些错误。 我有以下简单的课程: 在PHP中,我可以执行以下操作: 我该如何在python中做到这一点? 问题答案: 要访问对象的字段或方法,请使用dot : 如果将在运行时定义字段名称,请使用内置函数:

  • 我在做一些类似递归获取属性的事情 代码的问题是:它只下降了一级,我想知道如何使用反射自动获取所有属性?我刚刚编写了以下示例容器代码: 在主要方法中: 我希望得到: 我现在得到的结果是: 有人能帮我使用PrintProperties方法吗?非常感谢你。

  • 考虑以下实体: 的应该被延迟获取。问题是,当使用