Swift2.x 中类的计算属性set方法不能访问自身值

来源:互联网 发布:qq群成员提取软件 编辑:程序博客网 时间:2024/05/16 06:28
最近在学习swift2.x,在运用计算属性时出现了一些问题,例如下面这段代码:
import Foundationclass Test {    var testVar:Int {        get{            return self.testVar        }        set{            self.testVar = newValue        }    }}var t = Test()t.testVar = 2print(t.testVar)

它在编译时并不会报错,但是运行时会引起内存崩溃:
错误图片
错误为:

warning: could not load any Objective-C class information. This will
significantly reduce the quality of type information available.

提示完全看不懂啊摔!-_-b,经过仔细排查原来内存泄露了,这一句

self.testVar = newValue

实际上形成了一个对属性testVar的递归调用,因此把代码修改为这样就行了:

import Foundationclass Test {    var _testVar:Int = 0    var testVar:Int {        get{            return self._testVar        }        set{            self._testVar = newValue        }    }}var t = Test()t.testVar = 2print(t.testVar)//这里可以访问_testVarprint(t._testVar)

但是我们发现_testVar属性也可以直接从外部被调用,这就破坏了封装原则,所以我们可以将类的定义放在second.swift中,然后把_testVar加上private修饰符即可:
second.swift

import Foundationclass Test {    private var _testVar:Int = 0    var testVar:Int {        get{            return self._testVar        }        set{            self._testVar = newValue        }    }}

main.swift

import Foundationvar t = Test()t.testVar = 2print(t.testVar)

然后此时再在main.swift中访问_testVar编译器就会报错了:
这里写图片描述


然而在swift官方文档中找到了这句:
这里写图片描述
也就是说计算属性本来设计时就不是用来存储值的…………..
那xcode为毛不在编译时就报错啊(#‵′)靠→_→

0 0
原创粉丝点击