在swift 3中新增加了两中访问控制权限 fileprivate和 open。下面将对这两种新增访问控制做详细介绍。

fileprivate

在原有的swift中的 private其实并不是真正的私有,如果一个变量定义为private,在同一个文件中的其他类依然是可以访问到的。这个场景在使用extension的时候很明显。

class User {

private var name = "private"

}

extension User{

var accessPrivate: String {

return name

}

}

这样带来了两个问题:

  • 当我们标记为private时,意为真的私有还是文件内可共享呢?

  • 当我们如果意图为真正的私有时,必须保证这个类或者结构体在一个单独的文件里。否则可能同文件里其他的代码访问到。

由此,在swift 3中,新增加了一个 fileprivate来显式的表明,这个元素的访问权限为文件内私有。过去的private对应现在的fileprivate。现在的private则是真正的私有,离开了这个类或者结构体的作用域外面就无法访问。

open

open则是弥补public语义上的不足。

现在的pubic有两层含义:

  • 这个元素可以在其他作用域被访问

  • 这个元素可以在其他作用域被继承或者override

继承是一件危险的事情。尤其对于一个framework或者module的设计者而言。在自身的module内,类或者属性对于作者而言是清晰的,能否被继承或者override都是可控的。但是对于使用它的人,作者有时会希望传达出这个类或者属性不应该被继承或者修改。这个对应的就是 final。

final的问题在于在标记之后,在任何地方都不能override。而对于lib的设计者而言,希望得到的是在module内可以被override,在被import到其他地方后其他用户使用的时候不能被override。

这就是 open产生的初衷。通过open和public标记区别一个元素在其他module中是只能被访问还是可以被override。

下面是例子:

/// ModuleA:

// 这个类在ModuleA的范围外是不能被继承的,只能被访问

public class NonSubclassableParentClass {

public func foo() {}

// 这是错误的写法,因为class已经不能被继承,

// 所以他的方法的访问权限不能大于类的访问权限

open func bar() {}

// final的含义保持不变

public final func baz() {}

}

// 在ModuleA的范围外可以被继承

open class SubclassableParentClass {

// 这个属性在ModuleA的范围外不能被override

public var size : Int

// 这个方法在ModuleA的范围外不能被override

public func foo() {}

// 这个方法在任何地方都可以被override

open func bar() {}

///final的含义保持不变

public final func baz() {}

}

/// final的含义保持不变

public final class FinalClass { }

/// ModuleB:

import ModuleA

// 这个写法是错误的,编译会失败

// 因为NonSubclassableParentClass类访问权限标记的是public,只能被访问不能被继承

class SubclassA : NonSubclassableParentClass { }

// 这样写法可以通过,因为SubclassableParentClass访问权限为 `open`.

class SubclassB : SubclassableParentClass {

// 这样写也会编译失败

// 因为这个方法在SubclassableParentClass 中的权限为public,不是`open'.

override func foo() { }

// 这个方法因为在SubclassableParentClass中标记为open,所以可以这样写

// 这里不需要再声明为open,因为这个类是internal的

override func bar() { }

}

open class SubclassC : SubclassableParentClass {

// 这种写法会编译失败,因为这个类已经标记为open

// 这个方法override是一个open的方法,则也需要表明访问权限

override func bar() { }

}

open class SubclassD : SubclassableParentClass {

// 正确的写法,方法也需要标记为open

open override func bar() { }

}

open class SubclassE : SubclassableParentClass {

// 也可以显式的指出这个方法不能在被override

public final override func bar() { }

}

总结

现在的访问权限则依次为:open,public,internal,fileprivate,private。

有的人会觉得访问权限选择的增加加大了语言的复杂度。但是如果我们思考swift语言的设计目标之一就是一门安全的语言(“Designed for Safety”)就能理解这次的改动。更加明确清晰的访问权限控制可以使程序员表达出更准确的意图,当然也迫使在编码时思考的更加深入。

欢迎关注我的微博:@没故事的卓同学

相关链接:

SE0025-Scoped Access Level

http://t.cn/RcfswsG

SE0117-Allow distinguishing between public access and public overridability

http://t.cn/RttTE3p

转载于:https://www.cnblogs.com/fengmin/p/5870563.html

Swift 3必看:新的访问控制fileprivate和open相关推荐

  1. Swift 新特性 - 访问控制(Access Control)

    苹果在发布了Xcode 6 Bate 4后为Swift添加了新的特性--访问控制(Access Control),并且更新了The Swift Programming Language文档,我抽空把这 ...

  2. 同济大学计算机系拿奖学分绩点,萌新必看NO.8|关于学分绩点奖学金,你想知道的都在这里...

    原标题:萌新必看NO.8|关于学分绩点奖学金,你想知道的都在这里 结束高考,来到武汉大学,是否意味着你能够彻底放松呢?正在埋头苦读的小帮告诉你,对于大学生来说, 学习仍然非常重要.每个期末考试周,图书 ...

  3. 新基建必看系列——一文看懂爆火的智慧灯杆未来趋势及竞争格局

    新基建必看系列--一文看懂爆火的智慧灯杆未来趋势及竞争格局 智慧灯杆是集照明.视频监控.交通管理.环境监测.通信等多功能于一体的新型信息基础设施,由基础设施及杆体,照明设施,交通.视频监控等其他杆载设 ...

  4. 新角度解读C++内联函数的前世今生(上)(详细必看)

    引语: 首先在谈内联函数之前,我们先来讨论下C语言中是如何做的? 我们必须明白一点,在C语言中是没有内联函数的存在的,那么类似于内联函数作用的是什么呢? 答案是宏函数,他会在编译期间进行宏替换,达到函 ...

  5. 2019年网店店主必看:客服迎来新模式,店小蜜成商家宠儿

    2019年网店店主必看:客服迎来新模式,店小蜜成商家宠儿 常听人说淘宝越来越难做了,开个网店的成本已经超越实体店,产品又难卖.在收支不平衡开始逐渐倾斜下,往往头几年都在付出没有收获.抛开产品是否好卖不 ...

  6. 经济学入门必看:绝对经典的20部影片_ywyuan_新浪博客

    经济学入门必看:绝对经典的20部影片!据称看了这20部电影相当于读完北大经济学院.光华管理学院.清华经管学院. 在复杂的商业社会,你想创业,不懂经济.不懂商业.不懂人情世故.不懂法律边沿,你只有勇气. ...

  7. 禄劝县哪里有培训计算机,新消息!禄劝县护工培训必看

    禄劝县护工培训必看还有的老人生了很多子女,以为子女多好,不用担心,没人养老,其实老人不要抱太大的希望,因为想象比现实残酷,到头来还是没有子女愿意养老.老人一定要现实一点,不要总想指望子女,还不如靠自己 ...

  8. FW: 男人必看必看的十部经典电影_拔剑-浆糊的传说_新浪博客

    男人必看必看的十部经典电影[收藏] http://you.video.sina.com.cn/a/1498956-1342237005.html

  9. java重要基础知识点_必看 | 新人必看的Java基础知识点大梳理

    原标题:必看 | 新人必看的Java基础知识点大梳理 各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的"冰镇西瓜,"给大家清凉一下,压压惊. ...

  10. 干货!总结19个提升iOS开发技术的必看教程!

    2019独角兽企业重金招聘Python工程师标准>>> 又到了ibnShawari一周一篇技术推送的时间了,今天我为大家带来了iOS开发篇,绝对实用,绝对简单!!! iOS开发经典路 ...

最新文章

  1. Redis集群配置和常见异常解决
  2. 给js加版本号解决浏览器缓存问题
  3. 深度解读Facebook刚开源的beringei时序数据库——数据压缩delta of delta+充分利用内存以提高性能...
  4. 第四十章:基于SpringBoot Quartz完成定时任务分布式多节点负载持久化
  5. java满天星星代码_满天星空的代码实现
  6. HDLBits答案(5)_Generate实例化模块
  7. 深度学习实战 Tricks —— 梯度消失与梯度爆炸(gradient exploding)
  8. Matlab Tricks(十三)—— 提取矩阵的对角线元素
  9. LDA(latent dirichlet allocation)的应用
  10. 联想K3全系,救黑砖(只要手机链接电脑有端口识别就能恢复正常)
  11. JavaWeb核心编程之(三.6)HttpServlet
  12. 一文读懂Hoo Smart Chain的可视化公链
  13. 到了2017还在苦等房价下跌的人,你们可以醒醒了!
  14. 传奇添加地图与配置参数详解
  15. html字两边的横线_css实现中间文字 两边横线(原创)
  16. 上海市房管局局长否认房产税试点政策失败
  17. 轻武宽带认证计费系统白皮书2019
  18. Uniapp-APP后台保活插件(安卓后台保活)
  19. 使用Notepad++查看class文件
  20. 诚之和:机器人送餐8K超高清直播,5G赋能智慧冬奥

热门文章

  1. lisp 设计盘形齿轮铣刀_钨钢铣刀制造厂
  2. yaml与json的对比
  3. 全面详解c语言使用cJSON解析JSON字符
  4. 题解 CF1027D 【Mouse Hunt】
  5. mysql的varchar与text对比
  6. Vue.js 的开始!
  7. php语法------04 php内置函数之与页面表单请求相关的内置函数对象
  8. 《Nmap渗透测试指南》—第2章2.8节ICMP Ping Types扫描
  9. Android BackgroundViewPager:类似桌面背景壁纸随手指滑动
  10. Orchard核心机制