【问题标题】:How to create a custom getter method in Swift?如何在 Swift 中创建自定义 getter 方法?
【发布时间】:2018-08-15 08:53:16
【问题描述】:

我正在尝试使用以下代码为我的属性创建自定义 setter 方法:

var myProperty: String {
    get {
        if CONDITION1 {
            return CONDITION1_STRING
        } else if CONDITION2 {
            return CONDITION2_STRING
        } else{
            return myProperty
        }
    }
    set {
        
    }
}

但这给出了警告:

尝试在自己的 getter 中访问“myProperty”

【问题讨论】:

  • 在计算过程中不能引用计算属性,这在逻辑上看起来/感觉/是递归;您可能需要创建一个存储属性(例如fileprivate var myPrivateProperty: String = "")并且您可以返回它而不是return myPrivateProperty,并且在设置器中您需要为其分配新值,例如myPrivateProperty = newValue 工作完成。

标签: set swift4 var setter


【解决方案1】:

创建一个支持 ivar 并添加一个自定义 setter:

private var _myProperty: String 
var myProperty: String {
    get {
        if CONDITION1 {
            return CONDITION1_STRING
        } else if CONDITION2 {
            return CONDITION2_STRING
        } else {
            return _myProperty
        }
    }
    set {
        _myProperty = newValue
    }
}

【讨论】:

    【解决方案2】:

    首先引用 Apple Swift 文档:

    Computed Properties

    除了存储的属性、类、结构和 枚举可以定义计算属性,但实际上并没有 存储一个值。相反,它们提供了一个 getter 和一个可选的 setter 间接检索和设置其他属性和值。

    上面引用的第一件事是,您可以使用自定义的属性获取器和设置器来间接获取或设置其他属性的值,而无需将其公开或公开给其他人。

    如果您尝试在其自己的 getter 中访问/获取属性的值,那么您将再次调用 getter,并且循环会无限。正如我们所知,所有这些调用的分配都在堆栈上,并且堆栈的内存有限,所以一旦调用以满容量堆栈,它就无法处理任何更多的调用,并且会因 stackoverflow 错误而崩溃。

    所以,永远不要在自己的 getter 和 setter 中获取或设置属性的值。它们在这里提供对其他变量和属性的访问。

    让我们扩展您的代码以使用 myProperty 和自定义 getter。我在这里将其重命名为myName。

    private var firstName : String = ""
    private var lastName : String = ""
    
    var myName: String {
        get {
            if CONDITION1 {
                return firstName
            } else if CONDITION2 {
                return lastName
            } else {
                return firstName + lastName
            }
        }
    }
    

    在这里,我添加了两个私有属性 firstName 和 lastName,但将其设为 private。但是我添加了另一个公共属性myName,因此我实现了自定义getter,以根据条件检索用户名,并间接提供firstName 和lastName 的访问权限。

    通过同样的方式,您可以实现自定义设置器来设置用户的firstName 和lastName 的值。 但是你不能在自己的范围内使用self。

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2020-12-27
      相关资源
      最近更新 更多