我们在上课之前,一起来回顾一下以前曾提过的“SoC”的概念,我们说这个叫做“Separation of Concerns”,我把它翻译为责任分离——即不同的部分专注于自己的那一部分。或者说一个对象完成一个目标。
这样做的目标既让代码更加模块化易于维护,也让系统运行效率更高。所以说,我们要让对象之间的通信变得更加规范才行。
数据隐藏
你去看看你在写代码时候用到的那些框架,哪个给你直接展示了它里边的内容?它们都暴露了标准的接口给你,就像是一个个的黑箱,放进玻璃、塑料还有电池,一部相机就出来了。
所以说,参照这样的规则,我们在进行创建类的时候,也要这么做。
你愿意在讲台上才发现自己没穿裤子吗?
为了保证我们的代码足够健壮,将尽可能多的属性标记为 私有 (private)是个不错的选择。
我们一起来看个栗子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class CellPhone { var pushedNumber = 0 //储存按了哪个按钮 func theNumberIs() ->Int{ return pushedNumber //返回按了的数字 } } var myCellPhone = CellPhone() myCellPhone.pushedNumber = 9999999 //根本没有这个数字的按钮! myCellPhone.pushedNumber = -1 //这样都行?有没有王法?! myCellPhone.theNumberIs() |
请问谁的手机可以拨打“-1”这个号码?
你写的轮子,你写的程序,不一定就会比这个手机的类健壮多少。总有一些有心人在寻找类似这样的漏洞,所以说,我们应该避免这种情况,比如说使用非负的“UInt”类型来搞定复数问题,或者我们可以设定一个计算属性来避免直接操作类的属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class CellPhone { private var number:Int = 0 var pushedNumber:Int { get { return number } set(num) { if num >= 0 && num <= 9 { number = num } else { print("error!") } } } func theNumberIs() ->Int{ return pushedNumber } } var myCellPhone = CellPhone() myCellPhone.pushedNumber = 9999999 //error! myCellPhone.theNumberIs() //赋值失败,还是0 |
Swift 语言中的计算属性
除了属性,Swift 语言还有用于代替 getter 和 setter 的计算属性,它提供了一种只能用来操作其他数据而自身不能存储任何变量的属性,其实就是一种方法的包装……总之,这样用起来其实更方便了。
生存周期
好了,说完了封装的概念,我们再回过头聊一聊储存器中的值,我们都知道,变量可以放在各种地方来声明,比如类的外边,类的里边,甚至方法里边。对应这三个位置,这些变量有着不同的意义。
全局变量
声明在类之外的变量叫做全局变量,这个东西会随着你程序的运行而放在内存当中——直到你关闭程序,它才会被释放掉,所以说,使用全局变量要小心,如非必要,请不要使用。
如果错误使用了全局变量会发生什么呢?
不会发生什么,顶多就是程序越来越卡,直到卡死不响应,然后重新打开罢了。
实例属性
声明在类之中的变量叫做实例的属性,我们之前讨论的那些都是这个家伙,它声明在类当中,会随着对象的创建而放在堆里,知道对象被释放掉,它才会随着对象一起被垃圾收集器带走。
局部变量
他被声明在方法当中,一般我们不需要劳心费力地来给局部变量命名——因为它的存在时间太短啦——比如循环当中的计数器也是局部变量(毕竟那也是个方法),它随着方法的调用而被创建,等到方法执行完毕从桟顶被弹出,那么这个变量也就消失不见了。
什么是桟?我们后边的课程会讲到,现在你和它握个手就好了。
生效范围
不同位置的变量有不同的名字,它们的功能也不尽相同。全局变量是全部类和方法都能够访问到的,如果你要做点什么全局状态的保存,那么全局变量是个不错的选择。
而实例的属性就只能被自己的类中的方法来调用别的类想要调用那是不可能的事情——至于创建实例之后……记得我们说过封装吧?
局部变量则只能被这个方法内读取的到,别的方法就不行了,它生效范围最小,存在的时间最短,一般临时的小变量都是这样。
这节课没有作业,下节课我们做个游戏玩。
转载请保留出处和原文链接:https://www.logcg.com/archives/1112.html
Comments