swift---24.访问控制

  • 实体:

代码中可以设置访问级别的特性(属性、基本类型、函数等)

  • 模块:

框架或应用程序会作为一个独立的模块来构建和发布.不同模块,需要使用import导入.例子:通过"Xcode"创建的APP工程

  • 源文件:

模块内的代码文件.例子:工程内的某一个".swift"文件,同一个模块内,源文件之间可以互相调用,不需要导入

  • 访问控制:Swift为实体提供了5个访问级别

    • open:优先级最高,能被任何模块访问,能被其他模块继承并重写
    • public:优先级次之,能被任何模块访问,不能被其他模块继承并重写
    • internal:只能在模块内访问,不能被外部模块访问
    • fileprivate:只能在所定义的文件里访问,注意,Swift3.0才有该关键字
    • private:只能在定义域里访问
  • Swift中,实体的默认级别为internal

  • 访问级别基本原则

    • 不可以在某个实体中定义访问级别更低(更严格)的实体
      • 一个公开访问级别的变量,其类型的访问级别不能是内部,文件私有或是私有类型的。因为无法保证变量的类型在使用变量的地方也具有访问权限。
      • 函数的访问级别不能高于它的参数类型和返回类型的访问级别。因为这样就会出现函数可以在任何地方被访问,但是它的参数类型和返回类型却不可以的情况。
      public class SomePublicClass {}
      internal class SomeInternalClass {}
      fileprivate class SomeFilePrivateClass {}
      private class SomePrivateClass {}
      public var somePublicVariable = 0
      internal let someInternalConstant = 0
      fileprivate func someFilePrivateFunction() {}
      private func somePrivateFunction() {}
      
    • 如果一个类的访问级别是private,那么他的成员访问级别也是private,如果是public,那么他的成员级别是internal
    • 元组:

元组的访问级别由存入值中,访问级别最低的实体决定
- ###函数:
函数的访问级别,由它的参数或者返回类型来决定,且不会隐式转换,可以看到,我们定义了两个类,一个方法,方法返回值是一个元组,上面我们提到元组的访问级别由最低的实体决定,所以放回参数的访问级别为private,这时候如果我们不对方法限制,方法的默认级别为internal,则会引起报错
internal class SomeInternalClass {} private class SomePrivateClass {} //报错 //func someFunction() -> (SomeInternalClass, SomePrivateClass) { // return (SomeInternalClass(),SomePrivateClass()) //} private func anotherFunction() -> (SomeInternalClass, SomePrivateClass) { return (SomeInternalClass(),SomePrivateClass()) }
- ###枚举:
枚举的每个事件的访问级别,与枚举的访问级别相同,枚举的原始值类型的访问级别不能低于枚举的访问级别
public typealias A = Int public enum AnEnum:A { case A = 0 case B case C } //报错,因为枚举时public类型,而类型private private typealias B = Int //public enum AotherEnum:B { // case A = 0 // case B // case C //}
- ###嵌套类型:
嵌套类型中,如果外部是public类型,嵌套的类型为internal,其他的访问级别,与外部访问级别一致
- ###子类:
子类的访问级别不能高于父类,但子类能通过重写父类的方法与属性来改变访问级别
internal class ClassA { private var num:Int { return 1 } } //报错,子类访问级别不能高于父类 //public class ClassB:ClassA { // //} class ClassB:ClassA { override internal var num :Int{ return 3 } }
- ###常量,变量,属性,下标:
变量常量的访问级别不能高于实例对应类型的访问级别,属性,下标的访问级别也不可高于所在的类,
private class ClassA { //报警告 public var name = "" //报警告 public subscript(index:String) -> String { return "a" } } //报错,变量常量的访问级别不能高于实例对应类型的访问级别 //public var classA = ClassA()

- ###getter,setter:

我们可以通过调低属性的setter访问级别,使属性在外部变为只读属性.我们也可以同时设置属性的setter,getter的访问属性
struct TrackedString { internal private(set) var numberOfEdits = 0 var value: String = "" { didSet { numberOfEdits += 1 } } }
- ###构造器:
必要构造器的访问级别必须与它所在类型的访问级别相同,自定义构造器访问级别可以低于所在类
class ClassA { // //报错,必要构造器的访问级别过低 // private required init (name:String) { // // } private init (name:String) { } }
- ###类型别名:
低访问级别的类型不能转换为高访问级别的类型,高访问级别的类型可以随意转换成比其低级别的类型
private class ClassA { } public class ClassB { } //报错,低访问级别的类型不能转换为高访问级别的类型 //public typealias SomeClass = ClassA public typealias AnotherClass = ClassB

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 访问控制可以限定其他源文件或模块中代码对你代码的访问级别。你可以明确地给单个类型(类、结构体、枚举)设置访问级别,...
    零度_不结冰阅读 173评论 0 0
  • 可以明确地给单个类型(类、结构体、枚举)设置访问级别,也可以给这些类型的属性、方法、构造器、下标等设置访问级别。协...
    Andy_Ron阅读 201评论 0 2
  • 两张图片拼接 参考:https://www.feiyeda.top/http://csshengyao.cn/
    键盘仔阅读 374评论 0 0
  • 前天突然爬不起来了,去看医生,一堆事儿出来了,建议休息,吃中药调理。这两天就干脆休息,什么也不做,但娃的践行一刻都...
    烨妈阅读 178评论 0 0
  • 喜欢你 喜欢在每个星夜里想你 那漫天的星光 似你柔情的双眸 勾起我心头的暖意 喜欢你 喜欢在每个街头等你 于那匆匆...
    即是我阅读 226评论 0 0