Swift 3必看:新的访问控制fileprivate和open
在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相关推荐
- Swift 新特性 - 访问控制(Access Control)
苹果在发布了Xcode 6 Bate 4后为Swift添加了新的特性--访问控制(Access Control),并且更新了The Swift Programming Language文档,我抽空把这 ...
- 同济大学计算机系拿奖学分绩点,萌新必看NO.8|关于学分绩点奖学金,你想知道的都在这里...
原标题:萌新必看NO.8|关于学分绩点奖学金,你想知道的都在这里 结束高考,来到武汉大学,是否意味着你能够彻底放松呢?正在埋头苦读的小帮告诉你,对于大学生来说, 学习仍然非常重要.每个期末考试周,图书 ...
- 新基建必看系列——一文看懂爆火的智慧灯杆未来趋势及竞争格局
新基建必看系列--一文看懂爆火的智慧灯杆未来趋势及竞争格局 智慧灯杆是集照明.视频监控.交通管理.环境监测.通信等多功能于一体的新型信息基础设施,由基础设施及杆体,照明设施,交通.视频监控等其他杆载设 ...
- 新角度解读C++内联函数的前世今生(上)(详细必看)
引语: 首先在谈内联函数之前,我们先来讨论下C语言中是如何做的? 我们必须明白一点,在C语言中是没有内联函数的存在的,那么类似于内联函数作用的是什么呢? 答案是宏函数,他会在编译期间进行宏替换,达到函 ...
- 2019年网店店主必看:客服迎来新模式,店小蜜成商家宠儿
2019年网店店主必看:客服迎来新模式,店小蜜成商家宠儿 常听人说淘宝越来越难做了,开个网店的成本已经超越实体店,产品又难卖.在收支不平衡开始逐渐倾斜下,往往头几年都在付出没有收获.抛开产品是否好卖不 ...
- 经济学入门必看:绝对经典的20部影片_ywyuan_新浪博客
经济学入门必看:绝对经典的20部影片!据称看了这20部电影相当于读完北大经济学院.光华管理学院.清华经管学院. 在复杂的商业社会,你想创业,不懂经济.不懂商业.不懂人情世故.不懂法律边沿,你只有勇气. ...
- 禄劝县哪里有培训计算机,新消息!禄劝县护工培训必看
禄劝县护工培训必看还有的老人生了很多子女,以为子女多好,不用担心,没人养老,其实老人不要抱太大的希望,因为想象比现实残酷,到头来还是没有子女愿意养老.老人一定要现实一点,不要总想指望子女,还不如靠自己 ...
- FW: 男人必看必看的十部经典电影_拔剑-浆糊的传说_新浪博客
男人必看必看的十部经典电影[收藏] http://you.video.sina.com.cn/a/1498956-1342237005.html
- java重要基础知识点_必看 | 新人必看的Java基础知识点大梳理
原标题:必看 | 新人必看的Java基础知识点大梳理 各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的"冰镇西瓜,"给大家清凉一下,压压惊. ...
- 干货!总结19个提升iOS开发技术的必看教程!
2019独角兽企业重金招聘Python工程师标准>>> 又到了ibnShawari一周一篇技术推送的时间了,今天我为大家带来了iOS开发篇,绝对实用,绝对简单!!! iOS开发经典路 ...
最新文章
- Redis集群配置和常见异常解决
- 给js加版本号解决浏览器缓存问题
- 深度解读Facebook刚开源的beringei时序数据库——数据压缩delta of delta+充分利用内存以提高性能...
- 第四十章:基于SpringBoot Quartz完成定时任务分布式多节点负载持久化
- java满天星星代码_满天星空的代码实现
- HDLBits答案(5)_Generate实例化模块
- 深度学习实战 Tricks —— 梯度消失与梯度爆炸(gradient exploding)
- Matlab Tricks(十三)—— 提取矩阵的对角线元素
- LDA(latent dirichlet allocation)的应用
- 联想K3全系,救黑砖(只要手机链接电脑有端口识别就能恢复正常)
- JavaWeb核心编程之(三.6)HttpServlet
- 一文读懂Hoo Smart Chain的可视化公链
- 到了2017还在苦等房价下跌的人,你们可以醒醒了!
- 传奇添加地图与配置参数详解
- html字两边的横线_css实现中间文字 两边横线(原创)
- 上海市房管局局长否认房产税试点政策失败
- 轻武宽带认证计费系统白皮书2019
- Uniapp-APP后台保活插件(安卓后台保活)
- 使用Notepad++查看class文件
- 诚之和:机器人送餐8K超高清直播,5G赋能智慧冬奥