如何在 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 文档:
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 属性 firstName
和lastName
但是把它设为private
。但是我添加了另一个 属性 myName
即 public,所以我实现了自定义 getter 以根据条件检索用户名并提供 firstName
和 lastName
间接。
通过相同的方式,您可以实现自定义 setter 来设置用户的 firstName
和 lastName
的值。
但是你不能在自己的范围内使用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
}
}
我正在尝试使用以下代码为我的 属性 创建自定义 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 文档:
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 属性 firstName
和lastName
但是把它设为private
。但是我添加了另一个 属性 myName
即 public,所以我实现了自定义 getter 以根据条件检索用户名并提供 firstName
和 lastName
间接。
通过相同的方式,您可以实现自定义 setter 来设置用户的 firstName
和 lastName
的值。
但是你不能在自己的范围内使用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
}
}