我在num
中定义了计算属性ViewController
:
class ViewController: UIViewController {
var myArr:[Int]{
get {
return [1,2,3]
}
}
var num: Int{
get {
return myArr.count
}
set {}
}
fun updateState() {
num--
// why num is 3 here? why not 2?
print(num)
}
...
}
当我调用updateState()
函数时,它首先num--
,然后打印出num
,但它会给出3而不是2.为什么?
答案 0 :(得分:1)
num
将始终为3,因为它是一个计算属性,其值取自文字数组的长度。更改num
的唯一方法在当前代码中,更改myArray
的大小。
计算属性的get
方法用于确定其值,而不仅仅是其初始值,因此num--
在此上下文中实际上毫无意义。
因此,根据您的要求num
最初是数组的大小,然后可以修改,您需要一个存储的属性来跟踪当前值和一个setter方法:
class ViewController: UIViewController {
var trackingNum:Int?
var myArr:[Int]{
get {
return [1,2,3]
}
}
var num: Int{
get {
if self.trackingNum == nil {
self.trackingNum=self.myArr.count
}
return self.trackingNum
}
set {
self.trackingNum=newValue
}
}
func updateState() {
num--
print(num)
}
...
}
答案 1 :(得分:1)
你可以使你的num
属性变得懒惰,使其具有数组计数的初始值,并且仍然能够像你期望的那样递减它。
lazy var num: Int = { [unowned self] in
return self.myArr.count
}()
在您第一次引用num
答案 2 :(得分:0)
您尚未实施设定者。因此num始终返回数组的计数。这总是3。
答案 3 :(得分:0)
class C {
var myArr:[Int]{
get {
return [1,2,3]
}
}
lazy var num: Int = self.myArr.count
func updateState() {
num--
print(num)
}
}
let c = C()
c.updateState()
c.updateState()
c.updateState()
// ... prints
/*
2
1
0
*/