Swift中的Access Control权限控制介绍
如果您之前没有接触过权限控制,先来听一个小故事:
小明是五道口工业学院的一个大一新生,最近他有点烦恼,因为同屋经常用他的热水壶,好像那是自己家的一样,可是碍于同学情面,又不好意思说。直到有一天,他和学姐小K吐槽。
学姐听了之后,说:大学集体生活里面,大部分东西都是默认室友可以共用的。如果你不想别人拿,我可以帮你做封印,只要打上private标记,它们就看不到你的东西,更加用不了你的东西了。
小明说哇靠学姐你还会妖法......
Swift语言从Xcode6beta5版本起,加入了对权限控制(AccessControl)的支持。其实权限控制和小明的物品一样,你可以设定水壶是只有自己能用,还是只有宿舍里的人能用,还是全校都可以用。
从此以后,你可以好像神盾局局长一样,完全掌控自己的代码块的”保密级别“,哪些是只能在本文件引用,哪些能用在整个项目里,你还可以发挥大爱精神,把它开源成只要导入你的框架,大家都可以使用的API。
这三种权限分别是:
#####private私有的
在哪里写的,就在哪里用。无论是类、变量、常量还是函数,一旦被标记为私有的,就只能在定义他们的源文件里使用,不能为别的文件所用。
#####internal内部的
标记为internal的代码块,在整个应用(Appbundle)或者框架(framework)的范围内都是可以访问的。
#####public公开的
标记为public的代码块一般用来建立API,这是最开放的权限,使得任何人只要导入这个模块,都可以访问使用。
如果要把所有的爱加上一个期限,噢不,是给所有的代码块都标记上权限,不累死才怪。还好swift里面所有代码实体的默认权限,都是最常用的internal。所以当你开发自己的App时,可能完全不用管权限控制的事情。
但当你需要写一个公开API的时候,就必须对里面的代码块进行“隐身对其可见”的public标记,要么其他人是用不到的。
Private(私有级别)的权限最严格,它可以用来隐藏某些功能的细节实现方式。合理构筑你的代码,你就可以安全地使用extension和高级功能,又不把它们暴露给项目内的其他文件。
除了可以给整个声明设权限,Swift还允许大家在需要的时候,把某个属性(property)的取值权限比赋值权限设得更加开放。
#####举个例子:
publicclassListItem{
//ListItem这个类,有两个公开的属性 publicvartext:String publicvarisComplete:Bool
//下面的代码表示把变量UUID的赋值权限设为private,对整个app可读,但值只能在本文件里写入 private(set)varUUID:NSUUID
publicinit(text:String,completed:Bool,UUID:NSUUID){ self.text=text self.isComplete=completed self.UUID=UUID }
//这段没有特别标记权限,因此属于默认的internal级别。在框架目标内可用,但对于其他目标不可用 funcrefreshIdentity(){ self.UUID=NSUUID() }
publicoverridefuncisEqual(object:AnyObject?)->Bool{ ifletitem=objectas?ListItem{ returnself.UUID==item.UUID } returnfalse } }