如何在 Swift 中创建自定义 getter 方法?

How to create a custom getter method in Swift?

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

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

但这给出了警告:

Attempting to access 'myProperty' within its own getter

首先引用 Apple Swift 文档:

Computed Properties

In addition to stored properties, classes, structures, and enumerations can define computed properties, which do not actually store a value. Instead, they provide a getter and an optional setter to retrieve and set other properties and values indirectly.

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

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

因此,永远不要在 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
        }
    }
}

这里我添加了两个private 属性 firstNamelastName 但是把它设为private。但是我添加了另一个 属性 myName 即 public,所以我实现了自定义 getter 以根据条件检索用户名并提供 firstNamelastName间接。

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

创建支持 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
    }
}